因为BI的需要,需要将数据库A库的某些表传输至到另外的一个数据库B中。数据除了新增外,还需要更新 修改与删除的记录,所以自增ID的增量添加是满足不了需求的。
通过选型引入了阿里的Otter 框架,有一段时间工作正常。
某天BI说数据不同步了,登陆上otter Manager , 发现pipeline 有报错
详情pid:1 nid:1 exception:canal:xxx-db:3306;:java.io.IOException: Received error packet: errno = 1236, sqlstate = HY000 errmsg = Could not find first log file name in binary log index fileat com.alibaba.otter.canal.parse.inbound.mysql.dbsync.DirectLogFetcher.fetch(DirectLogFetcher.java:95)at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:121)at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:209)at java.lang.Thread.run(Thread.java:745)
心想出事了,日志跟不回来了。
最后为了修复数据及恢复同步,做了如下步骤:
1. DLL 不同步
2. 指定列进行同步
3. 收集 Master binlog 文件及位点信息
4. 手工复制对应的表
5. 修复 canal 位点设置
6. 重启对应的Channel , 并检查是否有新的业务数据写入
其中第5点走了点弯路,记录下来以备后用
1. 不用在 otter Manager 中修改位点信息, 修改了是不会生效的,估计是BUG
2. 正确修改办法是 修改 otter 关联的zk 集群记录
3. 修改路径为 /otter/canal/destinations/xxx-db:3306;/1/cursor
修改journalName 及position 的值 内容如下:
{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"xxx-db","port":3306}},"postion":{"included":false,"journalName":"binlog.000014","position":753033499,"serverId":1463306,"timestamp":1515496795000}}
命令 样例 set /otter/canal/destinations/xxx-db:3306;/1/cursor {"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"xxx-db","port":3306}},"postion":{"included":false,"journalName":"binlog.0001000","position":38,"serverId":1463306,"timestamp":1515496795000}}