問題一:java
ERROR c.a.otter.canal.parse.inbound.mysql.MysqlEventParser - dump address /192.168.1.50:3306 has an error, retrying. caused bymysql
com.alibaba.otter.canal.parse.exception.CanalParseException: can't find start position for examplesql
緣由:meta.dat 中保存的位點信息和數據庫的位點信息不一致;致使canal抓取不到數據庫的動做;數據庫
解決方案:刪除meta.dat刪除,再重啓canal,問題解決;服務器
集羣操做:進入canal對應的zookeeper集羣下,刪除節點/otter/canal/destinations/xxxxx/1001/cursor ;重啓canal便可恢復;app
問題二:測試
java.lang.OutOfMemoryError: Java heap space
fetch
canal消費端掛了過久,在zk對應conf下節點的ui
/otter/canal/destinations/test_db/1001/cursor 位點信息是很早之前,致使重啓canal時,從很早之前的位點開始消費,致使canal服務器內存爆掉google
監聽數據庫變動,只有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
http://www.javashuo.com/article/p-pwxquyjk-ck.html