canal meta.dat引起数据同步问题

canal meta.dat引起数据同步问题,第1张

发现问题

最近工作遇到canal数据停止同步问题,canal配置,代码一圈排查下来发现mq,canal log日志,服务器都无问题,一时之间竟无从下手了,好在观察够仔细,发现logs->example->example.log文件日志在报错误

     destination = example , address = rm-bp1735850pf3d3jnh.mysql.rds.aliyuncs.com/172.18.48.45:3306 , EventParser] ERROR c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - dump address rm-bp1735850pf3d3jnh.mysql.rds.aliyuncs.com/172.18.48.45:3306 has an error, retrying. caused by 
java.io.IOException: Received error packet: errno = 1236, sqlstate = HY000 errmsg = Could not find first log file name in binary log index file
        at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.DirectLogFetcher.fetch(DirectLogFetcher.java:102) ~[canal.parse-1.1.5.jar:na]
        at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:238) ~[canal.parse-1.1.5.jar:na]
        at com.alibaba.otter.canal.parse.inbound.AbstractEventParser.run(AbstractEventParser.java:262) ~[canal.parse-1.1.5.jar:na]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_312]

问题原因
canal conf->example->meta.dat文件记录的biglog同步位置,和数据库当前写入biglog位置不同,数据库binlog发生变动,导致canal拉取数据找不到

meta.dat文件详解

{"clientDatas":[{"clientIdentity":{"clientId":1001,"destination":"example","filter":""},"cursor":{"identity":
{"slaveId":-1,"sourceAddress":{"address":"rm-*.mysql.rds.aliyuncs.com","port":3306}},"postion":
{"gtid":"","included":false,"journalName":"mysql-bin.001749","position":12694605,"serverId":17440430,"timestamp":1652250682000}}}],"destination":"example"}

clientId 可以参考:canal/logs/example/meta.log
address:主库ip
port:主库端口
journalName : binlog名称。
position:开始同步的位置
timestamp : 延迟的时间(写0会从journalName开头开始同步)。
destination : 实例名(默认应该和当前目录名一致)

解决方案
先停止canal,把conf->example->meta.dat文件删除,在重启canal
重启会重新生成meta.dat文件,所记录的最新binlog文件和位置

注意:
如果在canal停止工作,监听的库表添加字段和表,canal将无法同步数据,会抛出错误 canal数据库(h2.db)表缺少字段和表

默认canal h2库里面的表结构和监听的库表结构对应不上
这种问题解决方式有两种
1.把canal.properties 文件默认库更换成一个新库,重新同步表结构(不建议,太麻烦了)
2.canal 监测的表,在canal停止工作时间内新增的字段,删除掉,canal恢复工作,在把字段新增上

对问题的思考

1.为什么canal mate.bat所记录的binlog位置对应不上
这个问题去网上找了答案,整理以下几个答案

  1. cncal停止工作,无法记录最新binlog位置
  2. 手动清理了mysql binlog文件
  3. 阿里云 rds mysql 自动清理binlog文件

我结合我遇到的问题,canal没有停止运行,binlog没有手动删除,数据库用的rds mysql且binlog文件会自动删除,我大概率定位到 3号问题
疑惑 ,翻到一篇回答,被删除的binlog并没有即时删除,canal也是近即时同步,为什么 meta.bat记录的binlog点位会对不上

删除binlog,cancal还能增量新增

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/920029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存