1.问题描述
mysqlbinlog 解析binlog中出现 Row event for unknown table 提示,如下图:
2.问题原因
2.1 解析binlog时指定的位点错误
在讲具体原因之前,我们需要先了解下Table_map_log_event。
1) 什么是Table_map_log_event
Table_map_log_event是Row Format Binlog中的一种Event。它记录了一个表的元数据信息。例如数据库名,表名和字段的类型等信息。当slave执行row events时,Table_map_log_event的作用有:
- 根据其中的数据库名和表名打开slave上对应的表
- 检测slave上的表的字段类型是否和master上的表的字段类型兼容。如果不兼容,slave会报告错误。
- 将数据转换成slave上表的字段类型。但转换紧限于slave和master的字段类型是兼容的情况。
使用mysqlbinlog解析binlog时,Table_map_log_event的作用就是提供表的定义信息,因为rows events中只包含 table id信息(binlog文件中的table id 同数据库视图中查到的表id不是一回事)。然后通过table id跟Table_map_log_event关联获取相关表的定义信息
2)Table_map_log_event 何时生成
Table_map_log_event以语句为单位。在语句记录第一个rows event之前,会为每一个要更新的表产生一个Table_map_log_event.
3) 错误原因分析
解析具体的 rows events 时会通过rows events 里面的 table id 去找到对应的 Table_map(Table_map保存了当前rows events操作的表的定义信息),找不到Table_map,那自然无法解析对应的 rows events。所以如果你解析binlog时 指定的开始和结束位点之间没有包含对应rows events的Table_map 那么就会报Row event for unknown table
2.2 如果解析的是relay-log 那么请看如下bug
bug大概就是说事务是不能跨binlog的,但是可以跨relay-log。所以如果你的事务分布在两个relay-log中,那么解析第二个relay-log中该事务的rows events时,就会因为没有Table_map_log_event信息报上面的信息
mysqlbinlog工具使用的几个疑惑点和解释 - 知乎
MySQL Bugs: #60964: row based relay log events are lost from mysqlbinlog output



