Canal客户端覆盖服务端Subscribe | 只有TRANSACTIONBEGIN和TRANSACTIONEND日志

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上或者很多博客中也有回复使用.*\\..*会覆盖服务端配置,这样确实会,但是这样会所有的表都不能匹配到该正则上。

Canal客户端覆盖服务端Subscribe | 只有TRANSACTIONBEGIN和TRANSACTIONEND日志

问题发现

发现问题是在修改了五六个小时之后回家睡觉的第二个早上,静下心来又分析了一次日志发现了问题所在。
下面图表示我的服务器端配置正则(没有问题正确的),客户端的正则(有问题的)。昨天心态崩了没有发现这一点细节。Cananl文档中是有提的库和表中间有两个\,其中一个就是用来转义的作用(毕竟服务器端读取配置需要读取文件并进行编码)。
Canal客户端覆盖服务端Subscribe | 只有TRANSACTIONBEGIN和TRANSACTIONEND日志

在客户端订阅的时候官方文档示例也是两个\,如下图。所以理所当然的就将两个\的订阅配置加入客户端配置中。但是,就会出现上面的日志,客户端的错误订阅(多了一个\)正则刷新掉了服务端的正确正则导致所有的表都被过滤掉了,就发生了只会出现事务日志的问题。
Canal客户端覆盖服务端Subscribe | 只有TRANSACTIONBEGIN和TRANSACTIONEND日志

正确客户端配置

声明环境,我的配置都是在nacos上,所以转义符对我来说没有意义,所以我的正则为.*\..*也就是去掉一个\。比如我监控的monitor库中monitor开头的表就是monitor\.monitor.*即可。下面成功。
还有一个注意点就是如果你直接写到代码中的订阅也不需要加转义符,请忽略官方文档的那行代码示例

Canal客户端覆盖服务端Subscribe | 只有TRANSACTIONBEGIN和TRANSACTIONEND日志

最后就是如果有老哥知道怎么过滤canal发送事务以及其他非dml类型日志解析的请留言一下,我不管怎么配置都无法生效。
Canal客户端覆盖服务端Subscribe | 只有TRANSACTIONBEGIN和TRANSACTIONEND日志