0
点赞
收藏
分享

微信扫一扫

mysql binlog

解析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

4. --skip-gtids

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


GTID的幂等性 开启GTID后,mysql恢复binlog时,重复的GTID的事务不再重复执行 就想恢复?怎么办? 是否使用--skip-gtids=true

​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 参数,因为不会解析出行格式

举报

相关推荐

0 条评论