天天看點

canal異常 Could not find first log file name in binary log index file問題解決解決過程

canal異常 Could not find first log file name in binary log index file

  • 問題
  • 解決
  • 解決過程

問題

最近在使用canal來監測資料庫的變化,處理變動的資料。由于有一段時間沒有用了,這次啟動在日志檔案中看到這個異常 Could not find first log file name in binary log index file,詳細資訊如下:

2020-12-16 19:14:42.053 [destination = tradeAndRefund , address = /192.168.1.6:3306 , EventParser] ERROR c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - dump address /192.168.1.6: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.4.jar:na]
        at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:235) ~[canal.parse-1.1.4.jar:na]
        at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:265) ~[canal.parse-1.1.4.jar:na]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_162]
2020-12-16 19:14:42.053 [destination = tradeAndRefund , address = /192.168.1.6:3306 , EventParser] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:tradeAndRefund[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)
        at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:235)
        at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:265)
        at java.lang.Thread.run(Thread.java:748)
]
           

解決

在配置目錄conf裡面對應的instance配置目錄下有一個meta.dat的檔案,裡面記錄了上次處理的位置。把這個檔案直接删掉,或者糾正裡面的binlog位置資訊,問題就解決了。

解決過程

首先我要說下我的環境。我用了canal的admin來進行叢集管理,canal.deployer中我使用start.sh local 來啟動了server。運作起來之後叢集狀态正常,檢視instance的日志就發現了上面的日志。

然後說一下我的解決過程。一開始看到這個問題,就知道是instance尋找binlog的位置資訊時出現了問題,是以翻了一下文檔。文檔中說可以通過canal.instance.master.journal.name和canal.instance.master.position這兩個配置來指定position,也可以通過canal.instance.master.timestamp來指定一個時間。但是這兩個配置我都試了,不行!始終有報錯。

最後是在沒辦法,隻好一行一行的看啟動日志,發現了下面這個資訊:

2020-12-16 19:14:42.045 [destination = tradeAndRefund , address = /192.168.1.6:3306 , EventParser] DEBUG java.sql.ResultSet - {rset-100008} Result: [31, 2020-11-10 17:00:18.504, 2020-11-10 17:00:18.504, tradeAndRefund, mysql-bin.000037, 536485765, 10, 1604921837000, 
           

這個是尋找location的日志,我發現這裡的檔案和位置都不是我設定的,那他是哪裡來的呢?最後我在canal.deployer的根目錄下執行

grep '000037' ./* -r

指令,最終剛發現在logs目錄和conf目錄下對應的instance中找到了這些内容。分别删掉這兩個東西進行重新開機,最後發現config下面那個是起作用的,把他給改了就好了。

問題解決~