Canal读取不到binlog的解决办法

最近带了个新人,给了他一套新部署还没正式上线的环境让他负责运维,今天测试的同事在在群里说MQ消息推送不过去了。
我帮着排查一下,按我的经验,通常是Canal的问题,于是我瞅了眼Canal的日志,果然报错了。
关键的错误就是这一句:

java.io.IOException: Received error packet: errno = 1236, sqlstate = HY000 errmsg = Could not find first log file name in binary log index file

这是说读取不到binlog了。
按日志里的信息,该Topic在读取的binlog和位点分别是mysql-bin.000010和984601。

{"identity":{"slaveId":-1,"sourceAddress":{"address":"mid1","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.000010","position":984601,"serverId":3232238851,"timestamp":1676468225000}}

我连上对应的MySQL,查看binlog,好家伙,变成mysql-bin.000001了!!!我第一反应,这小子不会是重装MySQL了吧。一问,他说他昨天发现MySQL的binlog有重复的(没懂是什么意思),然后他执行了reset master;
我。。。。

他又说他修改了Topic配置文件的canal.instance.master.journal.namecanal.instance.master.position配置项,把binlog和位点修改为现有的,但是重启Canal后没有生效。
这个问题在我刚接触Canal的时候也遇到过,修改配置文件中的binlog和位点,重启后发现Canal还在读以前的binlog和位点。这是因为Topic配置文件中的位点只是创建Topic时用于定位的,之后binlog的读取进度都记录在Zookeeper中,不再从配置文件中获取。所以Canal读取不到binlog的问题可以通过修改Zookeeper的Canal的信息来解决。

解决步骤如下:
先连接Zookeeper客户端

/usr/local/zookeeper/bin/zkCli.sh -server localhost:2181

然后修改对应的canal信息

# 查看现有canal位点信息
[zk: localhost:2181(CONNECTED) 13] get /otter/canal/destinations/segi_pub/parse
{"identity":{"slaveId":-1,"sourceAddress":{"address":"mid1","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.000001","position":207621226,"serverId":3232238851,"timestamp":1676529084000}}

# 修改
[zk: localhost:2181(CONNECTED) 14] set /otter/canal/destinations/segi_pub/parse {"identity":{"slaveId":-1,"sourceAddress":{"address":"mid1","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.000001","position":207621,"serverId":3232238851,"timestamp":1676529084000}}

最后重启canal。

posted @ 2023-02-16 15:55  Charramma  阅读(1253)  评论(0编辑  收藏  举报