报错:Encountered change event for table whose schema isn‘t known to this connector

当遇到'Encountered change event...whose schema isn't known to this connector'错误时,通常是由于配置错误、权限问题、数据库历史主题过期或Debezium模式设置不当导致的。解决方案包括检查数据库和表名拼写、验证用户权限、设置数据库历史主题永不过期、调整启动模式或重新同步数据。
摘要由CSDN通过智能技术生成

Debezium 报错处理

1. 报错详情

debezium 数据同步任务运行了一段时间时候,突然发现任务报了如下的错误信息:

Encountered change event ‘Event{header=EventHeaderV4{timestamp=1691131878000, eventType=TABLE_MAP, serverId=1111111, headerLength=19, dataLength=96, nextPosition=47142494, flags=0}, data=TableMapEventData{tableId=179, database=‘db_test’, table=‘t_order’, columnTypes=8, 8, 15, 15, 5, 5, 15, 5, 5, 5, 5, 15, 15, 15, 5, 3, 18, 15, columnMetadata=0, 0, 40, 32, 8, 8, 200, 8, 8, 8, 8, 8, 24, 24, 8, 0, 0, 200, columnNullability={2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17}, eventMetadata=null}}’ at offset {transaction_id=null, ts_sec=1691118931, file=mysql-bin.000001, pos=00000019, server_id=1111111, event=8} for table db_test.t_order whose schema isn’t known to this connector. One possible cause is an incomplete database history topic. Take a new snapshot in this case. Use the mysqlbinlog tool to view the problematic event: mysqlbinlog --start-position=1111111
–stop-position=1111209 --verbose mysql-bin.000001

2. 报错原因

从报错信息来看,最直接的原因是 connector找不到当前表t_order的 schema 信息

debezium 在刚开始的时候会读取数据库中的表的 schema 信息,除了会将 schema 信息保存到database history topic中外,还会将最新的 schema 信息保存到内存中。而现在的情况就是内存中缺少了对应数据表的schema信息。

上述的报错有以下几种可能性:
(1)配置中的数据库名称或者数据表名称书写错误,导致根据配置中的名称无法找到 schema 信息。这种情况一般发生在 job 刚启动的时候。

(2)当前配置的数据库 user 缺少对于该表的权限,导致无法读取表的 schema 信息。

(3)配置了database history topic用来保存数据库的历史 schema,但是没有将 topic 的过期时间修改为永不过期,导致该 topic 的消息过期,从而读取不到表的 schema 信息。

(4)如果使用的是 debezium而不是 flink cdc,并且配置了’debezium.snapshot.mode’='never’时,这样debezium 就会从 binlog 文件的开头位置读取 binlog。如果表的 schema 信息发生过更改,那么内存中最新的 schema 信息无法解析 binlog 文件开头的 binlog,即 schema 信息不匹配。

(5)如果使用的是FlinkCDC,对于数据表的每一个 update/delete/insert 事件,在 binlog 中会展示为一个 table_map 类型的事件和一个对应类型的事件(update_rows、delete_rows、insert_rows),然后以 STMT_END_F作为结束。而debezium 对于每一个 table-map 事件,都会根据事件信息中的 table_id 判断上下文中是否存在对应的 table元信息。如果 table_id 在上下文中不存在,则会根据配置inconsistent.schema.handling.mode来进行处理。该配置的默认值为fail,在这种情况下,会打印错误日志Encountered change event '{}' at offset {} for table {} whose schema isn't known to this connector,并且抛出异常DebeziumException,job 中断。

3. 解决方案

对于原因(1),需要检查数据库名称和数据表名称是否拼写正确,重点关注大小写;

对于原因(2),需要检查当前用户是否拥有足够的权限。

对于原因(3),需要将database history schema topic配置为永不过期,并且分区数设置为1;

对于原因(4),可以将启动模式修改为schema_recovery,然后重新启动connector来读取schema信息;

对于原因(5),需要重新同步数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值