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




