最近在使用 Canal 订阅 MySQL 数据变更然后推送到 Elasticsearch,遇到一个无法订阅到 MySQL 数据变更的奇怪问题,卡了两天晚上,特此记录。
现象
配置好 Canal,但是只能监听到事务开始和事务结束的消息,始终拿不到中间的 rowChange,数据自然是无法同步到 ES 中。
1 | Entry type: TRANSACTIONBEGIN, table: |
相关配置
已确认如下事项
- ✅ binglog 已开启
- ✅ binlog format = ROW
- ✅ binlog_row_image = FULL
- ✅ MySQL 的用户名、密码、权限正确
Canal Server 配置:
1 | # canal.instance.master.journal.name=binlog.000005 |
已删除 canal/conf/example/meta.dat 重启 Canal server。
nacos 上的 subscribe 配置:
1 | canal: |
总之,该检查的地方都已经确认没什么异常了,但是数据变更的时候依然只能接收到事务开始、结束的消息,接收不到 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 的正则配置