且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何查看二进制日志ROW模式下最原始的SQL语句

更新时间:2022-03-02 09:22:06

如何查看二进制日志ROW模式下最原始的SQL语句

 MySQL的binlog的ROW模式解析
     在mysql5.6以后,对主从数据一致性要求变高了,statement格式逐渐不太适合业务的需求了,所以生产环境大家都采用了row模
  式,row模式是传输最底层的数据变化的insert的模块来进行主从数据的传输,那么在binlog里面就和普通的statement模式有何差
  别?能否看到最原始的sql语句呢?
1、准备录入数据
   ①create table test1(id int,name varchar(20),sex enum('man','woman'),address varchar(20),grade tinyint(2));

    如何查看二进制日志ROW模式下最原始的SQL语句

   ②INSERT INTO test1 VALUES (0001,'tim','man','hebei','03'); 
     INSERT INTO test1 VALUES (0002,'scott','man','beijing','03');

    如何查看二进制日志ROW模式下最原始的SQL语句

2、Row模式binlog是乱码
   Row模式下面,binlog里面的ddl语句是正常显示的,但是dml是乱码
    /usr/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000005

   如何查看二进制日志ROW模式下最原始的SQL语句
   如何查看二进制日志ROW模式下最原始的SQL语句
   如何查看二进制日志ROW模式下最原始的SQL语句

3、通过--base64-output=decode-rows -v来查看dml语句
    /usr/bin/mysqlbinlog --base64-output=decode-rows -v /var/lib/mysql/mysql-bin.000005
    可以看到如下效果,不过都是最原始的dml块sql语句

   如何查看二进制日志ROW模式下最原始的SQL语句
   如何查看二进制日志ROW模式下最原始的SQL语句
    
   PS:这时可以看到dml的insert语句,但是只看到了最终的insert块,而看不到原始的过来的insert语句,很多时候排查问题
   需要原始的insert语句而不是底层的insert块。

4、通过binlog_rows_query_log_events参数来查看最原始的insert sql
  ①先在线设置全局的binlog_rows_query_log_events参数,刷新日志:
     set binlog_rows_query_log_events=1;     
  ②然后刷新日志录入新的数据记录
     flush logs;
     INSERT INTO test1 VALUES(0003,'tiger','man','beijing','03');
  ③解析binlog,没有看到原始的insert语句

   如何查看二进制日志ROW模式下最原始的SQL语句
   
  ④通过mysql的命令行查看最原始的insert sql语句
     show binlog events in 'mysql-bin.000007';
     
   如何查看二进制日志ROW模式下最原始的SQL语句

5、试验总结
     基于以上的试验,可以得出在row模式下,可以通过mysqlbinlog --base64-output=decode-rows –v查看最底层的insert数据
 模块,也可以通过命令行show binlog events in 'mysql-bin.000216';来实时查看最原始的insertsql记录。

   我们可以在搭建数据库的时候,在启动参数文件my.cnf里面事先设置好,如下所示:
     # vim my.cnf
     [mysqld]
     binlog_format=row  # binlog 日志格式
     binlog_rows_query_log_events = 1  # 将原始的操作sql记录写入事件中