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
相关产品推荐
相关产品推荐

