binlog日志介绍

MySQL的binlog 日志对于生产环境非常有用,任何时间对数据库的修改都会记录在binglog中;当数据发生增删改,创建数据库对象都会记录到binlog中,数据库的复制也是基于binlog进行同步数据;

BINLOG就是一个记录SQL语句的过程,和普通的LOG一样。不过只是她是二进制存储,普通的是十进制存储罢了。

binlog日志解析

  • 查看二进制binlog日志文件的列表

SHOW binary logs;

  • 输出SQL语句

    $ mysqlbinlog -v —base64-output=decode-rows mysql-bin.002490 | more $ mysqlbinlog -vv —base64-output=decode-rows mysql-bin.002490 >1.sql 将输出存储到一个文件中除了使用“>”以外,还可以使用“-r”选项

binlog默认是显示的二进制日志文件的内容;使用base64-output选项,可以控制输出语句何时是输出base64编码的BINLOG语句。

以下是base64输出设置的可能值: never always decode-rows auto(默认)

image.png
-v参数是可能从binlog中重建sql语句,-vv增加了备注部分。

  1. -v -vv --base64-output单独使用
  2. -v
  3. # 会显示dml语句具体做了什么操作,例如:insert语句,会显示出insert具体插入了什么数据;
  4. # 但是看不到完整的dml语句,例如:insert into t1(id) values(1);
  5. # 但还是会看到dml语句的"伪"sql语句,也看不懂;
  6. -vv
  7. # 会显示dml语句具体做了什么操作,例如:insert语句,会显示insert具体插入了什么数据;
  8. # 且可以看到完整的dml语句,例如:insert into t1(id) values(1);
  9. # 但还是会看到dml语句的"伪"sql语句
  10. --base64-output=decode-rows
  11. # 看不到dml语句的"伪" SQL语句
  12. # 看不到dml语句具体操作了什么数据
  13. ######## -v -vv --base64-output结合使用
  14. -v --base64-output=decode-rows
  15. # 看得到dml语句具体做了什么操作(例如:insert时具体插入了什么数据)
  16. # 看不到dml语句的完整sql语句(例如:insert into t1(id) values(1);)
  17. # 看不到dml语句的"伪"sql语句
  18. -vv --base64-output=decode-rows
  19. # 看得到dml语句具体做了什么操作(例如:insert时具体插入了什么数据)
  20. # 看得到dml语句的完整sql语句(例如:insert into t1(id) values(1);),但是被注释掉了的;
  21. # 看不到dml语句的"伪"sql语句


  • mysqlbinlog解析时指定数据库

默认情况下,mysqlbinlog会显示所有的内容,太过于杂乱。使用 -d 选项,可以指定一个数据库名称,将只显示在该数据库上所发生的事件。

mysqlbinlog -vv —base64-output=decode-rows mysql-bin.002490 -d cccrm >2.sql

  • 禁止恢复过程产生日志

在使用二进制日志文件进行数据库恢复时,该过程中也会产生日志文件,就会进入一个循环状态,继续恢复该过程中的数据。因此,当使用mysqlbinlog命令时,要禁用二进制日志,请使用下面所示的-D选项:

$ mysqlbinlog -D mysqld-bin.000001 $ mysqlbinlog -d -D databasename mysqld-bin.000001 > data.sql

  • 从一个特定位置提取条目

通常在mysql二进制日志文件中,你将看到如下所示的位置号。下面是mysqlbinlog的部分输出,你可以看到“210201”是一个位置编号。

下面的命令将从位置编号为210201的二进制日志条目处开始读取 $ mysqlbinlog -j 210201 mysqld-bin.000001 -r from-15028.out

  • 将条目截止到一个特定的位置

就像前面的例子一样,你也可以从mysql二进制日志中截止到一个特定位置的条目,如下所示。

$ mysqlbinlog —stop-position 15028 mysqld-bin.000001 > upto-15028.out

  • 查看特定开始时间的条目

下面将只提取从指定时间开始的条目。在此之前的任何条目都将被忽略。

$ mysqlbinlog —start-datetime=”2017-08-16 10:00:00” mysqld-bin.000001

当你想要从一个二进制文件中提取数据时,这是非常有用的,因为你希望使用它来恢复或重构在某个时间段内发生的某些数据库活动。时间戳的格式可以是MySQL服务器所理解的DATETIME和timestamp中的任何类型。

  • 查看特定结束时间的条目

与前面的开始时间示例一样,这里也可以指定结束时间,如下所示。

$ mysqlbinlog —stop-datetime=”2017-08-16 15:00:00” mysqld-bin.000001

上面的命令将读取到给定结束时间的条目。任何来自于超过给定结束时间的mysql二进制日志文件的条目都不会被处理。

在输出中只显示语句【待验证】
默认情况下,正如在前面的示例输出中看到的一样,除了SQL语句之外,在mysqlbinlog输出中还会有一些附加信息。如果只想查看常规的SQL语句,而不需要其他内容,那么可以使用 -s 选项,如下所示。
也可以使用 —short-form 选项,效果相同。

  • 从远程服务器获取二进制日志

在本地机器上,还可以读取位于远程服务器上的mysql二进制日志文件。为此,需要指定远程服务器的ip地址、用户名和密码,如下所示。
此处使用-R选项。-R选项与-read-from-remote-server相同。

$ mysqlbinlog -R -h 192.168.101.2 -p mysqld-bin.000001