栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

发现问题

最近工作遇到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$1.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还能增量新增

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/877586.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号