Canal数据同步,接收不到Rowdata类型
# Canal 数据同步,接收不到 Rowdata 类型
问题描述如下图,只能接收到 TRANSACTIONBEGIN 和 TRANSACTIONEND 日志,收不到 ROWDATA 类型数据,所以问题还是出在正则表达式身上。由于我本身客户端也有一份订阅正则表达式,覆盖了本身的正则表达式,一度改为
.*\\..*
也不好使,所以一开始被迷惑掉了。我们再回顾一下他的规范
常见例子:
1. 所有表:.* or .*\\..*
2. canal schema下所有表: canal\\..*
3. canal下的以canal打头的表:canal\\.canal.*
4. canal schema下的一张表:canal\\.test1
5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)
我们在覆盖客户端的订阅的时候,他在有的 Issue 上或者很多博客中也有回复使用.*\\..*
会覆盖服务端配置,这样确实会,但是这样会所有的表都不能匹配到该正则上。
# 问题发现
发现问题是在修改了五六个小时之后回家睡觉的第二个早上,静下心来又分析了一次日志发现了问题所在。
下面图表示我的服务器端配置正则 (没有问题正确的), 客户端的正则 (有问题的)。昨天心态崩了没有发现这一点细节。Cananl 文档中是有提的库和表中间有两个 \,其中一个就是用来转义的作用 (毕竟服务器端读取配置需要读取文件并进行编码)。
在客户端订阅的时候官方文档示例也是两个 \,如下图。所以理所当然的就将两个 \ 的订阅配置加入客户端配置中。但是,就会出现上面的日志,客户端的错误订阅 (多了一个) 正则刷新掉了服务端的正确正则导致所有的表都被过滤掉了,就发生了只会出现事务日志的问题。
# 正确客户端配置
声明环境,我的配置都是在 nacos 上,所以转义符对我来说没有意义,所以我的正则为
.*\..*
也就是去掉一个 \。比如我监控的 monitor 库中 monitor 开头的表就是monitor\.monitor.*
即可。下面成功。
还有一个注意点就是如果你直接写到代码中的订阅也不需要加转义符,请忽略官方文档的那行代码示例
# 关于我
Brath 是一个热爱技术的 Java 程序猿,公众号「InterviewCoder」定期分享有趣有料的精品原创文章!
非常感谢各位人才能看到这里,原创不易,文章如果有帮助可以关注、点赞、分享或评论,这都是对我的莫大支持!