問題一:
ERROR c.a.otter.canal.parse.inbound.mysql.MysqlEventParser - dump address /192.168.1.50:3306 has an error, retrying. caused by
com.alibaba.otter.canal.parse.exception.CanalParseException: can't find start position for example
原因:meta.dat 中保存的位點信息和數據庫的位點信息不一致;導致canal抓取不到數據庫的動作;
解決方案:刪除meta.dat刪除,再重啟canal,問題解決;
集群操作:進入canal對應的zookeeper集群下,刪除節點/otter/canal/destinations/xxxxx/1001/cursor ;重啟canal即可恢復;
問題二:
java.lang.OutOfMemoryError: Java heap space
canal消費端掛了太久,在zk對應conf下節點的
/otter/canal/destinations/test_db/1001/cursor 位點信息是很早以前,導致重啟canal時,從很早以前的位點開始消費,導致canal服務器內存爆掉
監聽數據庫變更,只有TransactionBegin/TransactionEnd,沒有拿到數據的EventType;
原因可能是canal.instance.filter.black.regex=.*\\..*導致,改canal.instance.filter.black.regex=再重啟試試;
問題三:
ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:fdyb_db[com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed.
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed.
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: com.google.common.collect.ComputationException: com.alibaba.otter.canal.parse.exception.CanalParseException: fetch failed by table meta:`mysql`.`pds_4490277`
Caused by: com.google.common.collect.ComputationException: com.alibaba.otter.canal.parse.exception.CanalParseException: fetch failed by table meta:`mysql`.`pds_4490277`
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: fetch failed by table meta:`mysql`.`pds_4490277`
Caused by: java.io.IOException: ErrorPacket [errorNumber=1142, fieldCount=-1, message=SELECT command denied to user 'cy_canal'@'11.217.0.224' for table 'pds_4490277', sqlState=42000, sqlStateMarker=#]
with command: desc `mysql`.`pds_4490277`
分析:mysql系統表權限較高,canal讀該表的binlog失敗,位點無法移動
解決:將配置項中黑名單加上mysql下的所有表:canal.instance.filter.black.regex = mysql\\..* ,修改后canal集群不需要重啟即可恢復;
其它注意點:檢查下CanalConnector是否調用subscribe(filter)方法;有的話,filter需要和instance.properties的canal.instance.filter.regex一致,否則subscribe的filter會覆蓋instance的配置,如果subscribe的filter是.*\\..*,那么相當於你消費了所有的更新數據。
問題四:
現象:數據庫修改后,canal應用感知不到binlog,數據無法正常消費處理;
定位:1.查看canal服務器,canal應用,zk服務器的日志,確認無異常;2.查看mysql,es服務器,無異常,3.查看canal服務器,canal應用配置項,發現canal服務器的canal.properties有問題;
原因:canal.properties中配置了canal.ip和canal.zkServers,如果是zk集群模式下的canal配置了canal.ip,則會優先按IP連接canal服務器,從而讓zk功能失效,位點文件則會保存到本地;一旦本地位點文件出現問題,各方無錯誤日志,問題就很難排查;
解決:將canal.ip配置項置為空,關掉canal服務器,canal應用,刪除zk上的節點,重啟canal服務器,canal應用,問題解決;
問題五:
canal啟動,創建數據庫的腳本為
CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_name` /*!40100 DEFAULT CHARACTER SET utf8mb4 */
canal啟動報錯,無法處理.
2019-06-13 16:18:59.318 [destination = example , address = /Ip:port , EventParser] WARN c.a.otter.canal.parse.inbound.mysql.tsdb.MemoryTableMeta - parse faield : CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_name` /*!40100 DEFAULT CHARACTER SET utf8mb4 */
com.alibaba.fastsql.sql.parser.ParserException: illegal name, pos 40, line 1, column 17, token HINT
at com.alibaba.fastsql.sql.parser.SQLExprParser.name(SQLExprParser.java:1812) ~[fastsql-2.0.0_preview_855.jar:2.0.0_preview_855]
at com.alibaba.fastsql.sql.dialect.mysql.parser.MySqlStatementParser.parseCreateDatabase(MySqlStatementParser.java:6543) ~[fastsql-2.0.0_preview_855.jar:2.0.0_preview_855]
at com.alibaba.fastsql.sql.dialect.mysql.parser.MySqlStatementParser.parseCreate(MySqlStatementParser.java:292) ~[fastsql-2.0.0_preview_855.jar:2.0.0_preview_855]
at com.alibaba.fastsql.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:228) ~[fastsql-2.0.0_preview_855.jar:2.0.0_preview_855]
at com.alibaba.fastsql.sql.SQLUtils.parseStatements(SQLUtils.java:536) ~[fastsql-2.0.0_preview_855.jar:2.0.0_preview_855]
at com.alibaba.fastsql.sql.repository.SchemaRepository.console(SchemaRepository.java:439) ~[fastsql-2.0.0_preview_855.jar:2.0.0_preview_855]
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.MemoryTableMeta.apply(MemoryTableMeta.java:81) ~[canal.parse-1.1.3.jar:na]
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.applyHistoryOnMemory(DatabaseTableMeta.java:463) [canal.parse-1.1.3.jar:na]
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.rollback(DatabaseTableMeta.java:174) [canal.parse-1.1.3.jar:na]
at com.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.processTableMeta(AbstractMysqlEventParser.java:106) [canal.parse-1.1.3.jar:na]
at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:192) [canal.parse-1.1.3.jar:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_192]
查詢tsdb的meta_history,把相關的創建語句進行修改,去掉 /* 這些字符, 重啟OK。
問題六:
rocketmq自動創建topic的隊列配置為4,
在canal的具體的一個instance里面配置的instance.properties,其中 canal.mq.partitionsNum=16,錯誤是無限重試發送。
修復方式是canal.mq.partitionsNum=4, (但是在測試環境沒有復現)
注意事項:
數據庫操作存在batch update,
canal發送到rocketmq的數據,data字段存在的數據有可能是多條,且數量不一(例如:批量更新了10,可能發了3條消息,一條消息包括1條數據,1條消息包括3條數據,1條消息包括6條數據)。
轉自:
https://www.jianshu.com/p/3e5c289a2228
https://blog.csdn.net/my201110lc/article/details/77885720