canal同步異常:當表結構變化時,同步失敗

場景

canal 同步Mysql一段時間後突然失敗,報如如下錯誤:

2021-08-06 16:16:51.732 [MultiStageCoprocessor-Parser-Twt_instance-5] WARN  c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - table parser error : header {
  version: 1
  logfileName: "mysql3306-bin.001715"
  logfileOffset: 970738018
rowDatas {
  beforeColumns {
    index: 0
    sqlType: 4
    updated: false
    isNull: false
    value: "2443"
  }
....
  

經定位發現,部分表結構發生變化造成的binlog無法解析。

當前集羣採用的是默認的tsdb方案,也就是內嵌的H2數據庫。

在HA環境下如果發生Server切換/表結構變更,會出現無法正確解析Binlog的問題。

解決方案

採用MySQL作爲Canal的tsdb存儲
  • 之前的配置
# table meta tsdb info
canal.instance.tsdb.enable = true
canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:}
canal.instance.tsdb.url = jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
canal.instance.tsdb.dbUsername = canal
canal.instance.tsdb.dbPassword = canal
  • 解決方案

集羣的配置只要把H2改爲mysql就可以了,顯然要進行元數據管理,
但是我們在之前執行的sql中並不包含相關的建表語句。

到官網去找相關建表語句:

CREATE TABLE IF NOT EXISTS `meta_history` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `gmt_create` datetime NOT NULL COMMENT '創建時間',
  `gmt_modified` datetime NOT NULL COMMENT '修改時間',
  `destination` varchar(128) DEFAULT NULL COMMENT '通道名稱',
  `binlog_file` varchar(64) DEFAULT NULL COMMENT 'binlog文件名',
  `binlog_offest` bigint(20) DEFAULT NULL COMMENT 'binlog偏移量',
  `binlog_master_id` varchar(64) DEFAULT NULL COMMENT 'binlog節點id',
  `binlog_timestamp` bigint(20) DEFAULT NULL COMMENT 'binlog應用的時間戳',
  `use_schema` varchar(1024) DEFAULT NULL COMMENT '執行sql時對應的schema',
  `sql_schema` varchar(1024) DEFAULT NULL COMMENT '對應的schema',
  `sql_table` varchar(1024) DEFAULT NULL COMMENT '對應的table',
  `sql_text` longtext DEFAULT NULL COMMENT '執行的sql',
  `sql_type` varchar(256) DEFAULT NULL COMMENT 'sql類型',
  `extra` text DEFAULT NULL COMMENT '額外的擴展信息',
  PRIMARY KEY (`id`),
  UNIQUE KEY binlog_file_offest(`destination`,`binlog_master_id`,`binlog_file`,`binlog_offest`),
  KEY `destination` (`destination`),
  KEY `destination_timestamp` (`destination`,`binlog_timestamp`),
  KEY `gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='表結構變化明細表';

CREATE TABLE IF NOT EXISTS `meta_snapshot` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `gmt_create` datetime NOT NULL COMMENT '創建時間',
  `gmt_modified` datetime NOT NULL COMMENT '修改時間',
  `destination` varchar(128) DEFAULT NULL COMMENT '通道名稱',
  `binlog_file` varchar(64) DEFAULT NULL COMMENT 'binlog文件名',
  `binlog_offest` bigint(20) DEFAULT NULL COMMENT 'binlog偏移量',
  `binlog_master_id` varchar(64) DEFAULT NULL COMMENT 'binlog節點id',
  `binlog_timestamp` bigint(20) DEFAULT NULL COMMENT 'binlog應用的時間戳',
  `data` longtext DEFAULT NULL COMMENT '表結構數據',
  `extra` text DEFAULT NULL COMMENT '額外的擴展信息',
  PRIMARY KEY (`id`),
  UNIQUE KEY binlog_file_offest(`destination`,`binlog_master_id`,`binlog_file`,`binlog_offest`),
  KEY `destination` (`destination`),
  KEY `destination_timestamp` (`destination`,`binlog_timestamp`),
  KEY `gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='表結構記錄錶快照表';

在canal_manager庫中執行執行上述兩個語句

修改集羣配置文件

# table meta tsdb info
canal.instance.tsdb.enable = true
canal.instance.tsdb.url=jdbc:mysql://172.x.x.x:3306/canal_manager
canal.instance.tsdb.dbUsername = canal
canal.instance.tsdb.dbPassword = canal

#canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml
canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml

保存配置,重啓集羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章