问题描述:
canal+kafka+mysql 的方式进行数据同步,instance.properties中配置的过滤器不生效canal.instance.filter.regex ,所有表的改动都会向kafka发送消息
问题分析:
1. canal的问题:配置不正确,版本bug等
2. mysql的binlog的问题:canal不能正确解析binlog中的表名。
参照官方常见问题中的解决方案,一项一项的进行比对。
1. 过滤器正则表达式是否正确
1. All the tables: .* or .*\\..*
2. All the tables in canal scheme: canal\\..*
3. Tables starting with canal in canal scheme: canal\\.canal.*
4. Access a table in canal scheme: canal.test1
2. mysql配置
[mysqld]
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
3. (因为我是canal直接发kafka略过这条)检查CanalConnectors是否调用了subscription(filter)方法。如果是这样,则过滤器应与instance.properties中的canal.instance.filter.regex一致,否则订阅过滤器将覆盖实例中的设置。请注意,如果用于订阅的过滤器是。* / .. *,则您已消耗了所有更新的数据。
4. 看instance的启动日志中,过滤器是否设置正确
日志目录/canal目录/logs/example/example.log
c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter :^.*\..*$
c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter :
以上都检查之后,问题还是没有解决。
之前在其他环境部署过canal ,这个环境的过滤器是好用的,随后比较两个环境canal的配置文件,并下载最新的canal1.1.5,重新配置canal,还是不行。把其他环境的canal修改配置拿过来运行还是不行。所以感觉不是不是canal的配置问题,把注意力转移到mysql的binlog上,比较两个环境mysql产生binlog文件的内容,发现一个binlog中有执行的sql,一个没有执行的sql,有执行sql的环境,canal过滤器不起作用。
随后修改mysql的配置文件/etc/my.cnf 将binlog中的sql去掉,问题解决!
binlog中的sql可能影响了canal对binlog中表名的解析。