MySQL学习【第12篇】MySQL日志管理

一、MySQL日志简介

日志文件选项文件名/表名称程序
错误--log-errorhost_name.errN/A
常规--general_loghost_name.log general_logN/A
慢速查询--slow_query_log --long_query_timehost_name-slow.log slow_logmysqldumpslow
二进制--log-bin --expire-logs-dayshost_name-bin.000001mysqlbinlog
审计--audit_log --audit_log_fileaudit.logN/A

1、 错误日志

1)作用: 记录mysql数据库的一般状态信息及报错信息,是我们对于数据库常规报错处理的常用日志。

2)默认位置:

$MYSQL_HOME/data/

3)开启方式:(MySQL安装完后默认开启)

#编辑配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
log_error=/application/mysql/data/$hostname.err

#查看方式
mysql> show variables like 'log_error';

2、一般查询日志

1)作用: 记录mysql所有执行成功的SQL语句信息,可以做审计用,但是我们很少开启。

2)默认位置:

$MYSQL_HOME/data/

3)开启方式:(MySQL安装完之后默认不开启)

#编辑配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
general_log=on
general_log_file=/application/mysql/data/$hostnamel.log

#查看方式
mysql> show variables like '%gen%';

3、二进制日志

1)作用: 记录已提交的DML事务语句,并拆分为多个事件(event)来进行记录 记录所有DDL、DCL等语句 总之,二进制日志会记录所有对数据库发生修改的操作

2)二进制日志模式: statement:语句模式(默认模式); row:行模式,即数据行的变化过程; mixed:以上两者的混合模式。

企业推荐使用row模式

3)优缺点:

statement模式:

优点:简单明了,容易被看懂,就是sql语句,记录时不需要太多的磁盘空间。 缺点:记录不够严谨。

row模式:

优点:记录更加严谨。 缺点:有可能会需要更多的磁盘空间,不太容易被读懂。

4)binlog的作用

  • 如果我拥有数据库搭建开始所有的二进制日志,那么我可以把数据恢复到任意时刻
  • 数据的备份恢复
  • 数据的复制

二、二进制日志管理实践

 1、开启二进制row模式

1)添加开启二进制配置文件
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin	#配置完成后路径不要修改,有坑
#binlog_format=row
#server_id=1		#注意:在mysql5.7中开启binlog必须要加上server-id

2)重启数据库
[root@db02 ~]# /etc/init.d/mysqld restart

3)开启binlog_format=row并重启数据库
[root@db02 ~]# ll /application/mysql/data/    #重启会新增一个binlog
-rw-rw---- 1 mysql mysql      120 Mar 27 03:49 mysql-bin.000002

2、二进制日志的操作

1)物理查看,会产生两个日志文件
[root@db02 ~]# ll /application/mysql/data/
-rw-rw---- 1 mysql mysql      120 Mar 27 03:22 mysql-bin.000001		
-rw-rw---- 1 mysql mysql       19 Mar 27 03:22 mysql-bin.index

2)命令行查看
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       120 |
+------------------+-----------+
1 row in set (0.00 sec)

mysql> show master status;	#查看binlog信息
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> show binlog events in 'mysql-bin.000001';

 3、事件介绍

  • 在binlog中最小的记录单元为event
  • 一个事务会被拆分成多个事件(event)

4、事件(event)特性

  • 每个event都有一个开始位置(start position)和结束位置(stop position)。
  • 所谓的位置就是event对整个二进制的文件的相对位置。
  • 对于一个二进制日志中,前120个position是文件格式信息预留空间。
  • MySQL第一个记录的事件,都是从120开始的。

5、row模式下二进制日志分析及数据恢复

###statement模式###

1)创建一个binlog库
mysql> create database binlog;

2)使用binlog库
mysql> use binlog

3)创建binglog_table表
mysql> create table binlog_table(id int);

4)查看binlog信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      331 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

5)插入数3条数据
mysql> insert into binlog_table values(1),(2),(3);
mysql> select * from binlog_table;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

6)查看binlog信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      565 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

#提交(如果开启自动提交则不需要输入)
mysql> commit;

7)查看binglog日志
[root@db02 ~]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000001

=========================================================================================
###row(行级)模式###
1)创建一个binlog1库
mysql> create database binlog1;

2)使用binlog库
mysql> use binlog1

3)创建binglog_table表
mysql> create table binlog1(id int);

4)插入数3条数据
mysql> insert into binlog1 values(1),(2),(3);
mysql> select * from binlog1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

#提交(如果开启自动提交则不需要输入)
mysql> commit;

5)查看binglog日志
[root@db02 ~]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000002

=========================================================================================
###删除数据库###

1)创建一个test库
mysql> create database binlog_test;

2)使用test库
mysql> use binlog_test

3)创建binglog_test表
mysql> create table binlog_test(id int);

4)插入数3条数据
mysql> insert into binlog_test values(1);
mysql> insert into binlog_test values(2);
mysql> insert into binlog_test values(3);

5)查看binlog信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |     1408 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

6)删除数据1
mysql> delete from binlog_test where id=1;

7)更改数据2为22
mysql> update binlog_test set id=22 where id=2;

8)查询当前数据
mysql> select * from binlog_test;
+------+
| id   |
+------+
|   22 |
|    3 |
+------+
2 rows in set (0.00 sec)

9)删表
mysql> drop table binlog_test;

10)删库
mysql> drop database binlog_test;

6、恢复数据到delete之前

1)查看binlog事件
mysql> show binlog events in 'mysql-bin.000002';
#或使用mysqlbinlog来查看
[root@db02 data]# pwd
/application/mysql/data
[root@db02 data]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000002
或
[root@db02 data]# mysqlbinlog /application/mysql/data/mysql-bin.000002
[root@db02 data]# mysqlbinlog /application/mysql/data/mysql-bin.000002|grep -v SET

7、截取二进制日志

1)查看二进制日志后,发现delete语句开始位置是1487(不是新表找创表语句)
[root@db02 data]# mysqlbinlog --start-position=120 --stop-position=1408 /application/mysql/data/mysql-bin.000002 >/tmp/test_binlog.sql

2)临时关闭binlog
mysql> set sql_log_bin=0;

3)执行sql文件
mysql> source /tmp/test_binlog.sql

4)查看删除的库
mysql> show databases;

5)进binlog_test库
mysql> use binlog_test

6)查看删除的表
mysql> show tables;

7查看表中内容
mysql> select * from binlog_test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

至此恢复完成!

 8、删除、刷新binlog

刷新binlog日志
1)flush logs;
2)重启数据库时会刷新
3)二进制日志上限(max_binlog_size)

删除二进制日志
1)原则:在存储能力范围内,能多保留则多保留,基于上一次全备前的可以选择删除

=========================================================================================
1、根据存在时间删除日志
#临时生效
set global expire_logs_days = 7;

#永久生效
[root@db01 data]# vim /etc/my.cnf
[mysqld]
expire_logs_days = 7

2、使用purge命令删除
purge binary logs before now() -interavl 3day;

3、根据文件名删除
purge binary logs to 'mysql-bin.000010';

4、使用reset master
mysql> reset master; 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值