暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql binlog

原创 进击的CJR 2022-06-10
1184


解析binlog查看内容

mysqlbinlog --no-defaults -vv --base64-output=decode-rows mysql-bin.000001


解析指定范围的事务

时间段解析

mysqlbinlog --no-defaults -vv --base64-output=decode-rows --start-datetime='2022-06-09 08:00:00' --stop-datetime='2022-06-09 12:00:00' mysql-bin.000001

位置点解析

mysqlbinlog --no-defaults -vv --base64-output=decode-rows --start-position='1' --stop-position='1347' mysql-bin.000001

gtid解析

mysqlbinlog --no-defaults -vv --base64-output=decode-rows --include-gtids='f971d5f1-d450-11ec-9e7b-5254000a56df:21' mysql-bin.000001


参数详解

1. --no-defaults

可以避免 my.cnf 里配了 [client] 某些 mysqlbinlog 没有的参数导致 mysqlbinlog 失败

2. -v

mysqlbinlog --no-defaults    -vv mysql-bin.000001 

不加,只显示行格式(即那一串字符串),无法得到伪 SQL :

SET @@SESSION.GTID_NEXT= 'f971d5f1-d450-11ec-9e7b-5254000a56df:22'/*!*/;
SET TIMESTAMP=1654828813/*!*/;
BEGIN

BINLOG '
Da+iYhM7dg8ALQAAAAIWAAAAAKwDAAAAAAEABHRlc3QAAnQyAAEDAAGGaq9E
Da+iYh47dg8AKAAAACoWAAAAAKwDAAAAAAEAAgAB//4CAAAAVlSeJw==
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;

加 -v,从行格式中重建伪SQL(带注释),不显示 binlog_rows_query_log_events 参数效果:

BINLOG '
Da+iYhM7dg8ALQAAAAIWAAAAAKwDAAAAAAEABHRlc3QAAnQyAAEDAAGGaq9E
Da+iYh47dg8AKAAAACoWAAAAAKwDAAAAAAEAAgAB//4CAAAAVlSeJw==
'/*!*/;
### INSERT INTO `test`.`t2`
### SET
###   @1=2
# at 5674

加 -vv,从行格式中重建伪SQL并添加字段数据类型的注释,可以显示 binlog_rows_query_log_events 参数效果:

BINLOG '
Da+iYhM7dg8ALQAAAAIWAAAAAKwDAAAAAAEABHRlc3QAAnQyAAEDAAGGaq9E
Da+iYh47dg8AKAAAACoWAAAAAKwDAAAAAAEAAgAB//4CAAAAVlSeJw==
'/*!*/;
### INSERT INTO `test`.`t2`
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
# at 5674
#220610 10:40:13 server id 1013307  end_log_pos 5705 CRC32 0xc1e1b48c   Xid = 1406
COMMIT/*!*/;

3. 加 --base64-output=decode-rows

不显示行格式,如果同时加 -v 参数,可以从行格式中解码为带注释的伪SQL:

 mysqlbinlog --no-defaults  --base64-output=decode-rows  -vv mysql-bin.000001 
### INSERT INTO `test`.`t2`
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
# at 5674
#220610 10:40:13 server id 1013307  end_log_pos 5705 CRC32 0xc1e1b48c   Xid = 1406
COMMIT/*!*/;

4. --skip-gtids

不保留 GTID 事件信息,这样回放 binlog 时会跟执行新事务一样,生成新的 GTID。对比如下:


GTID的幂等性 开启GTID后,mysql恢复binlog时,重复的GTID的事务不再重复执行 就想恢复?怎么办? 是否使用--skip-gtids=true 参数,要根据情况来定;

第一种情况: 如果我们是要恢复数据到源数据库或者和源数据库有相同 GTID 信息的实例, 那么就要使用该参数。如果不带该参数的话,是无法恢复成功的。
因为包含的 GTID 已经在源数据库执行过了, 根据 GTID 特性,一个 GTID 信息在一个数据库只能执行一次,所以不会恢复成功。

第二种情况: 如果是恢复到其他实例的数据库并且不包含源实例的 GTID 信息,那么可以不使用该参数, 使用或者不使用都可以恢复成功。

mysqlbinlog --no-defaults -vv --skip-gtids --include-gtids='f971d5f1-d450-11ec-9e7b-5254000a56df:22' mysql-bin.000001

[root@VM-16-10-centos binlog]# mysqlbinlog --no-defaults    -vv --skip-gtids --include-gtids='f971d5f1-d450-11ec-9e7b-5254000a56df:22' mysql-bin.000001  
/*!50616 SET @@SESSION.GTID_NEXT='AUTOMATIC'*//*!*/;
BINLOG '
Da+iYhM7dg8ALQAAAAIWAAAAAKwDAAAAAAEABHRlc3QAAnQyAAEDAAGGaq9E
Da+iYh47dg8AKAAAACoWAAAAAKwDAAAAAAEAAgAB//4CAAAAVlSeJw==
'/*!*/;
### INSERT INTO `test`.`t2`
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
# at 5674
COMMIT/*!*/;
DELIMITER ;


回放一定不能加 --base64-output=decode-rows 参数,因为不会解析出行格式



最后修改时间:2022-06-10 14:45:30
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论