You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB大量binlog生成及Update_rows与表ID相关问题咨询

MySQL Binlog中Update_rows记录与UPDATE查询数量差异问题解答

现象描述

我发现每个binlog文件中存在近13830条Update_rows记录,但日志中的UPDATE查询却很少:

  • 执行命令 mysqlbinlog mysql-bin.005400 | grep -i 'Update' | grep -i '#Q> UPDATE' | wc -l,仅统计到85条UPDATE查询;
  • 执行命令 mysqlbinlog mysql-bin.005400 | grep -i 'Update' | grep -i 'Update_rows: table id' | wc -l,统计出13830条如下格式的记录:

server id 1 end_log_pos 108614456 CRC32 0xfe8e56d5 Update_rows: table id 49992010


问题解答

1. 此处的table id是什么?

table id是MySQL内部为每个表分配的唯一标识符,由InnoDB存储引擎在系统表空间中维护,是一个自增数值。每个表在创建时会被分配唯一的table id,即使表被删除,该id也不会被复用(除非重启MySQL实例)。

2. 为何会出现如此大量的上述记录?

核心原因在于binlog格式和数据更新的触发方式:

  • ROW模式binlog:如果binlog采用ROW格式,MySQL不会记录原始的UPDATE SQL语句,而是记录每一行数据的变更细节。一条批量更新多行的UPDATE语句,会生成多条Update_rows记录,直接导致Update_rows数量远大于原始UPDATE查询数。
  • 隐式更新操作:部分更新并非手动执行UPDATE语句触发,比如触发器执行的更新、外键级联更新、LOAD DATA配合ON DUPLICATE KEY UPDATE触发的行级更新等,这些操作只会在binlog中生成Update_rows记录,无法被#Q> UPDATE的过滤规则捕获。

3. 如何根据该table id找到对应的具体表?

可以通过以下几种方法定位:

  • 查询系统表:执行SQL语句,替换目标table id:
SELECT TABLE_SCHEMA, TABLE_NAME 
FROM INFORMATION_SCHEMA.INNODB_TABLES 
WHERE TABLE_ID = 49992010;
  • 解析binlog上下文:使用mysqlbinlog的详细模式解析,查看对应table id的关联表信息:
mysqlbinlog -v -v mysql-bin.005400 | grep -B5 -A5 'Update_rows: table id 49992010'

通常在Update_rows记录前后会有Table_map事件,其中包含表的库名和表名。

  • 旧版本查看frm文件(不推荐):MySQL 5.6及更早版本中,表的frm文件会存储table id,可通过hexdump工具查看,但操作繁琐,仅适用于旧版本场景。

内容的提问来源于stack exchange,提问作者Sheikh Wasiu Al Hasib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 22:40:02