Canal订阅不到MySQL数据变更

最近在使用 Canal 订阅 MySQL 数据变更然后推送到 Elasticsearch,遇到一个无法订阅到 MySQL 数据变更的奇怪问题,卡了两天晚上,特此记录。

现象

配置好 Canal,但是只能监听到事务开始和事务结束的消息,始终拿不到中间的 rowChange,数据自然是无法同步到 ES 中。

1
2
Entry type: TRANSACTIONBEGIN, table:
Entry type: TRANSACTIONEND, table:

相关配置

已确认如下事项

  • ✅ binglog 已开启
  • ✅ binlog format = ROW
  • ✅ binlog_row_image = FULL
  • ✅ MySQL 的用户名、密码、权限正确

Canal Server 配置:

1
2
3
# canal.instance.master.journal.name=binlog.000005
# canal.instance.master.position=427117
canal.instance.filter.regex = my_chat\\.chat_message

已删除 canal/conf/example/meta.dat 重启 Canal server。

nacos 上的 subscribe 配置:

1
2
canal:
subscribe: my_chat\\.chat_message

总之,该检查的地方都已经确认没什么异常了,但是数据变更的时候依然只能接收到事务开始、结束的消息,接收不到 rowChange。

原因

使用的是最新版本的 canal-1.18,怀疑是 canal 版本和 MySQL 版本匹配问题,尝试将使用 canal-1.17,发现也是同样的问题。

转机出现在想起前不久学习 canal 的时候写过一个小 demo,是可以跑通的,于是想对比一下代码到底差在哪儿。将代码照搬过来之后可以跑通了,唯一不同的就是将从 nacos 配置中心读取的 subscribe 配置改成了硬编码,具体来说是:my_chat\\.chat_message 变为 my_chat.chat_message!在 Java 代码里是不需要转义的!!

其他可能的原因

其他还有一些老生常谈的可能原因,大致如下:

  • MySQL 本身的 binlog 配置
  • canal server 配置:canal.instance.filter.regex 配置
  • canal.instance.master.position 配置
  • 应用本身订阅消息 subscribe 的正则配置