发现问题
最近工作遇到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位置对应不上
这个问题去网上找了答案,整理以下几个答案
- cncal停止工作,无法记录最新binlog位置
- 手动清理了mysql binlog文件
- 阿里云 rds mysql 自动清理binlog文件
我结合我遇到的问题,canal没有停止运行,binlog没有手动删除,数据库用的rds mysql且binlog文件会自动删除,我大概率定位到 3号问题
疑惑 ,翻到一篇回答,被删除的binlog并没有即时删除,canal也是近即时同步,为什么 meta.bat记录的binlog点位会对不上
删除binlog,cancal还能增量新增
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)