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

使用mysqlbinlog解析binlog日志

328

mysqlbinlog命令

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
    )。

这些日志的作用

  1. 环境一致性:确保从库执行相同操作时,环境与主库一致(如隔离级别、字符集)。
  2. 复制准确性:GTID 和时间戳保证事务在复制过程中的顺序和唯一性。
  3. 故障恢复:在时间点恢复(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
    )。

这些日志的作用

  1. 环境一致性:确保从库执行相同操作时,环境与主库一致(如隔离级别、字符集)。
  2. 复制准确性:GTID 和时间戳保证事务在复制过程中的顺序和唯一性。
  3. 故障恢复:在时间点恢复(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
    部分表示更新后的记录值

 or  


👇👇👇 

文章转载自PostgreSQL运维技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论