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