mysqlbinlog --start-datetime="2025-05-20 16:00:00" --stop-datetime="2025-05-20 23:59:59" --base64-output=decode-rows -v mysql-bin.003579 | grep -E -A20 -B10 "Table_map: \`dbs\`.\`tb1\`|.*rows: table id [0-9]+" > tb1_changes.log
.mysqlbinlog部分
--start-datetime
和 --stop-datetime
:指定时间范围
--base64-output=decode-rows
:解码基于行的二进制日志
-v
:输出详细信息
mysql-bin.003579
:指定要解析的 binlog 文件
2.grep部分
-E
:使用扩展正则表达式
-A20 -B10
:显示匹配行前后的若干行
正则表达式:
Table_map: \
dbs.
tb1`:匹配表映射事件
.*rows: table id [0-9]+
:匹配所有行操作事件(如 Update_rows、Write_rows)
优化建议:
1.指定数据库:
--database=dbs
2.增强grep过滤:
| grep -E -A20 -B10 "Table_map: \`dbs\`.\`tb1\`|.*rows: table id [0-9]+"
3.明确指定行操作类型(Update/write/delete)
4.可以处理多个binlog文件
mysql-bin.003579 mysql-bin.003580 mysql-bin.003581 # 指定多个 binlog 文件
binlog解析
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 783001907
#250520 16:00:45 server id 1 end_log_pos 783001980 CRC32 0xae66ee3a Query thread_id=6287952 exec_time=0 error_code=0
SET TIMESTAMP=1747728045/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
BEGIN
/*!*/;
# at 783001980
#250520 16:00:45 server id 1 end_log_pos 783002125 CRC32 0x27bcfed4 Table_map: `dbs`.`tb1` mapped to number 108
# at 783002125
#250520 16:00:45 server id 1 end_log_pos 783002552 CRC32 0x37bdd539 Update_rows: table id 108 flags: STMT_END_F
### UPDATE `dbs`.`tb1`
### WHERE
### @1=56824
### @2='575339'
### @3='xxxxx'
### @4=2
### @5=1
### @6=1
### @7=120.40373214027746
### @8=30.135383764172886
### @9='xxxxx'
### @10=0
### @11='2025-04-21 09:42:36'
### @12=''
### @13=18
### @14=NULL
### @15=NULL
### @16=NULL
### @17=NULL
### @18='xxxxxx'
### @19=NULL
### @20=NULL
### @21=NULL
### @22=NULL
### @23=NULL
### @24=NULL
### @25=NULL
### @26=NULL
### @27=NULL
### @28=2035
### @29=1
### @30=NULL
### @31=NULL
### @32=0
### @33=2049
### @34=0
### @35=27
### @36=NULL
### @37=NULL
### @38=NULL
### @39=NULL
### @40=NULL
### @41=500
### @42=NULL
### @43=NULL
### @44=NULL
### @45=NULL
### @46=NULL
### @47=NULL
### @48=2
### @49=NULL
### @50=NULL
### @51=NULL
### @52=NULL
### @53=NULL
### @54=NULL
### SET
### @1=56824
### @2='575339'
### @3='xxxxxx'
### @4=2
### @5=1
### @6=1
### @7=128.40373214027746
### @8=30.135383764172886
### @9='xxxxxxxxxx'
### @10=0
### @11='2025-04-21 09:42:36'
### @12=''
### @13=18
### @14=NULL
### @15='07:00:00'
### @16='10:00:00'
### @17=NULL
### @18='xxxxx'
### @19=0
### @20=NULL
### @21=NULL
### @22=NULL
### @23=NULL
### @24=NULL
### @25=NULL
### @26=NULL
### @27=NULL
### @28=2035
### @29=1
### @30=NULL
### @31=NULL
### @32=0
### @33=2049
### @34=0
### @35=27
### @36=NULL
### @37=NULL
### @38=NULL
### @39='None'
### @40=NULL
### @41=500
### @42=NULL
### @43=NULL
### @44=NULL
### @45=NULL
### @46=NULL
### @47=NULL
### @48=1
### @49=NULL
### @50=NULL
### @51=NULL
### @52=NULL
### @53=NULL
### @54=NULL
元数据部分
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 783001907
#250520 16:00:45 server id 1 end_log_pos 783001980 CRC32 0xae66ee3a Query thread_id=6287952 exec_time=0 error_code=0
SET TIMESTAMP=1747728045/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
1.事务隔离级别设置
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
/*!50718 ... */
:这是 MySQL 的版本特定注释,表示该语句仅在 MySQL 5.7.18 及以上版本执行。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
:将事务隔离级别设置为 读已提交,这是 MySQL 中常用的隔离级别,可避免脏读。
2.GTID 设置
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
GTID(全局事务标识符):用于唯一标识每个事务,简化主从复制。
ANONYMOUS
:表示这是一个 匿名事务,即未使用 GTID 模式的事务。如果 MySQL 未启用 GTID,则所有事务都属于此类。
3.时间戳设置
SET TIMESTAMP=1747728045/*!*/;
TIMESTAMP
:设置当前会话的时间戳,用于记录 SQL 执行时间。
1747728045
:Unix 时间戳(秒),转换为可读时间是 2025-05-20 16:00:45(与日志中的时间一致)。
4.字符集设置
/*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
/*!\C utf8 */
:设置客户端字符集为 UTF-8。
character_set_client=33
:客户端字符集(33 对应 utf8mb4
)。
collation_connection=33
:连接排序规则。
collation_server=8
:服务器默认排序规则(通常是 utf8_general_ci
)。
这些日志的作用
环境一致性:确保从库执行相同操作时,环境与主库一致(如隔离级别、字符集)。
复制准确性:GTID 和时间戳保证事务在复制过程中的顺序和唯一性。
故障恢复:在时间点恢复(PITR)时,这些设置可重现原始执行环境。
1.事务隔离级别设置
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
/*!50718 ... */
:这是 MySQL 的版本特定注释,表示该语句仅在 MySQL 5.7.18 及以上版本执行。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
:将事务隔离级别设置为 读已提交,这是 MySQL 中常用的隔离级别,可避免脏读。 2.GTID 设置
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
GTID(全局事务标识符):用于唯一标识每个事务,简化主从复制。
ANONYMOUS
:表示这是一个 匿名事务,即未使用 GTID 模式的事务。如果 MySQL 未启用 GTID,则所有事务都属于此类。 3.时间戳设置
SET TIMESTAMP=1747728045/*!*/;
TIMESTAMP
:设置当前会话的时间戳,用于记录 SQL 执行时间。
1747728045
:Unix 时间戳(秒),转换为可读时间是 2025-05-20 16:00:45(与日志中的时间一致)。 4.字符集设置
/*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
/*!\C utf8 */
:设置客户端字符集为 UTF-8。
character_set_client=33
:客户端字符集(33 对应 utf8mb4
)。
collation_connection=33
:连接排序规则。
collation_server=8
:服务器默认排序规则(通常是 utf8_general_ci
)。
这些日志的作用
环境一致性:确保从库执行相同操作时,环境与主库一致(如隔离级别、字符集)。
复制准确性:GTID 和时间戳保证事务在复制过程中的顺序和唯一性。
故障恢复:在时间点恢复(PITR)时,这些设置可重现原始执行环境。
数据部分
1.事务开始
begin 表示一个新事务的开始。
2.表映射
Table_map: `dbs`.`tb1` mapped to number 108
系统将dbs.tb1
表映射为内部 ID 108,后续行操作会引用这个 ID。
3.更新操作
Update_rows: table id 108 flags: STMT_END_F
对 ID 为 108 的表(即tb1
表)进行更新,STMT_END_F
表示这是语句结束标志。
4.具体更新内容 这是解码后的实际更新内容:
@1
到@154代表表的各个列(通常
@1`是主键)
WHERE
部分是更新前的记录值
SET
部分表示更新后的记录值
|