2016/06/03

mysql binary log


mysql 日志: 错误日志,通用日志,二进制日志,慢查询日志。

错误日志 mysql error log 用于记录 mysql server 每次启动和关闭的详细信息以及运行过程中出现严重的警告和错误信息。

通用日志 mysql general log 用于记录建立的客户端连接和执行的语句。

二进制日志 mysql binary log 用于记录数据库的变动。每一次变动都将会生成一条日志写入二进制文件中。往后我们就可以通过二进制 文件进行历史查询,备案,恢复,主从复制操作。

慢查询日志 mysql long query log 用于记录所执行时间超过 long_query_time 秒的查询。


二进制日志

查看当前所有二进制文件及大小。

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       150 |
| mysql-bin.000002 |       150 |
| mysql-bin.000003 |       107 |
+------------------+-----------+
3 rows in set (0.00 sec)

切换新日志

mysql> flush logs;
Query OK, 0 rows affected (0.13 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       150 |
| mysql-bin.000002 |       150 |
| mysql-bin.000003 |     12256 |
| mysql-bin.000004 |       107 |
+------------------+-----------+
4 rows in set (0.07 sec)

3种方式删除二进制日志

1.使用 purge 命令删除指定日志

//删除指定日志
mysql> purge binary logs to 'mysql-bin.000003';

//删除某时间点之前的日志
mysql> purge binary logs before '2016-06-03 10:00:00';

pugrge删除的日志,index文件也将相应删除指定记录,但是 pugrge 不会删除最新正在使用的一条日志。


2.使用 expire-log-days 删除失效日志,设置变量 mysql> set global expire_logs_days=天 , 删除超出这个变量保留期之前的所有日志被删除。默认值为 0, 表示没有自动删除。

在什么时候进行检测删除过期日志了?
每次进行 flush logs 之后进行自动检测删除过期日志。

什么时候会触发 flush logs?
1.重启
2.binary log 文件大小达到参数 max_binlog_size限制时
3.手工执行指令。

注意自动删除过期日志是建立在 flush logs 之后, 是之后, 是之后,是之后, 重要事情说三遍。 假设当前二进制日志为 mysql-bin.000003 , 当我执行 flush logs, 会在当前mysql-bin.000003文件写入一条结束记录,并生成新的 二进制文件 mysql-bin.000004 。因为 mysql-bin.000003 做了数据写入, 所以文件的最新修改时间为当前, 而又因为自动检测删除 过期日志是依据 二进制文件 修改时间来判断的。因此这次 mysql-bin.000003 将不会被删除。


3.reset master 方式, 将删除在索引文件中列出所有的日志文件并重置索引文件,最后生成一个新的binlog文件。 该操作之前先备份binlog至其它位置以备以后需要。


二进制日志提取

通过 show events 查看

查看当前正在写入的 binlog 文件
mysql> show master status;

查看 mysql-bin.000003 文件的内容
mysql> show binlog events in 'mysql-bin.000003';

获取 mysql-bin.000003 从位置 Pos=213 位置开始 的内容, 并进行分页
mysql> show binlog events in 'mysql-bin.000003' from 213 limit 0, 25;

通过 mysqlbinlog 指令查看

提取指定的binlog日志
# mysqlbinlog /usr/local/mysql/var/mysql-bin.000001
# mysqlbinlog /usr/local/mysql/var/mysql-bin.000001|grep insert

提取指定position位置的binlog日志
# mysqlbinlog --start-position="120" --stop-position="332" /usr/local/mysql/var/mysql-bin.000001

提取指定position位置的binlog日志并输出到压缩文件
# mysqlbinlog --start-position="120" --stop-position="332" /usr/local/mysql/var/mysql-bin.000001 |gzip >extra_01.sql.gz

提取指定position位置的binlog日志导入数据库
# mysqlbinlog --start-position="120" --stop-position="332" /usr/local/mysql/var/mysql-bin.000001 | mysql -uroot -p

提取指定开始时间的binlog并输出到日志文件
# mysqlbinlog --start-datetime="2016-06-03 10:00:00" /usr/local/mysql/var/mysql-bin.000002 --result-file=extra02.sql

提取指定位置的多个binlog日志文件
# mysqlbinlog --start-position="120" --stop-position="332" /usr/local/mysql/var/mysql-bin.000001 /usr/local/mysql/var/mysql-bin.000002|more

提取指定数据库binlog并转换字符集到UTF8
# mysqlbinlog --database=test --set-charset=utf8 /usr/local/mysql/var/mysql-bin.000001 /usr/local/mysql/var/mysql-bin.000002 >test.sql

远程提取日志,指定结束时间
# mysqlbinlog -uroot -p -h192.168.1.111 -P3306 --stop-datetime="2016-06-03 10:00:00" --read-from-remote-server mysql-bin.000033 |more

远程提取使用row格式的binlog日志并输出到本地文件
# mysqlbinlog -uroot -p -P3606 -h192.168.1.111 --read-from-remote-server -v inst3606bin.000005 >row.sql