Canal 常见问题

1、Caused by: com.alibaba.otter.canal.common.CanalException: requestGet for canal config error: auto cluster : null is not found.

出现这个问题,主要是配置

1、canal_local.properties 设置 canal.admin.register.cluster = xxx
2、admin 界面创建 xxx 同名 cluster
3、admin 集群管理->操作->主配置->载入模板->保存

启动canal

问题:数据同步时,接收到的entryType为ROWDATA的binlog,其eventType为QUERY,而不是期望的INSERT/UPDATE/DELETE
  • 原因1: binlog模式为非Row模式。针对Statement/Mixed模式,DML语句都会以SQL语句存在。

  • 解决1: 通过show variables like ‘binlog_format’查看MySQL中binlog的模式,若为非Row模式则通过SET GLOBAL binlog_format = ‘ROW’;(全局设置,需重启后生效)和SET binlog_format = ‘ROW’;(当前设置,当无法重启服务时同时设置这两个参数)进行更改。

  • 原因2: MySQL开启了binlog_rows_query_log_events当这个设置开启后,MySQL不仅会将数据行级变化写入binlog,还会将执行数据变化的sql语句也写入到binlog中。观察eventType为QUERY的entry可以发现,订阅到的binlog中包含有SQL语句。

  • 解决2: 通过 show variables like 'binlog_rows%' 查看binlog_rows_query_log_events是否为ON,若是的话则通过 set global binlog_rows_query_log_events=off;(全局设置,需重启后生效)和 set binlog_rows_query_log_events=off;(当前设置,当无法重启服务时同时设置这两个参数)关闭;或者可以通过更改canal.properties文件中的过滤配置来解决:canal.instance.filter.query.dml = true

问题:数据表过滤条件不生效,或只能接收到entryTypeTRANSACTIONBEGINTRANSACTIONEND的entry,接收不到ROWDATA类型数据
  • 原因1: Canal Server配置中 canal.instance.filter.black.regex=.*\\..*

  • 解决1: 更改 canal.instance.filter.black.regex= 后重启

  • 原因2: Canal订阅配置有误

  • 解决2:

    • 1、首先对照canal.instance.filter.regex 的书写规范格式检查正则表达式:

      多个正则之间以逗号(,)分隔,转义符需要双斜杠()
      常见例子:
      所有表:.* or .\…
      canal schema下所有表: canal\…*
      canal下的以canal打头的表:canal.canal.*
      canal schema下的一张表:canal.test1
      多个规则组合使用:canal\…*,mysql.test1,mysql.test2 (逗号分隔)

    • 2、检查binlog是否为Row模式,非Row模式将不会解析sql,无法提取数据表名进行过滤。
    • 3、检查Canal客户端是否调用subscribe(filter)方法,若filter与canal.instance.filter.regex不一致,则会覆盖服务端配置。
    • 4、 官方实例中都是使用如.\..所示的双斜杠\进行过滤配置,原意是需要一个\作为转义符,但这可能导致在不需要转义符的时候错误地过滤数据表。可通过Canal日志对比filter是否与期望的一致:
      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 :

特别注意: 在某些情况下(如binlog为非Row模式),当过滤配置生效后,除去TRANSACTIONBEGIN和TRANSACTIONEND,监听的表发生变更时会发送一个QUERY的entry和一个INSERT/UPDATE/DELETE的entry,而过滤的表变更时也会发送一个QUERY的entry,这并不代表过滤没有生效。我在关闭binlog_rows_query_log_events后没有再收到过其他数据库和数据表变更发送的QUERY日志。

问题:Could not find first log file name in binary log index file或Can’t find start position for example
  • 原因: Canal是模拟从库,因此同样可能会出现主从数据库不一致的情况,具体表现为meta.dat中保存的位点信息和数据库的位点信息不一致,导致canal抓取不到数据库的动作。
  • 解决: 删除meta.dat文件,再重启Canal,会自动重新生成正确的meta.dat文件。我在解决这个问题时只删除meta.dat并没有成功,删除meta.dat所在的整个文件夹后重启,问题解决。
作者:Jeebiz  创建时间:2023-05-29 10:01
最后编辑:Jeebiz  更新时间:2024-07-10 22:56