canal同步异常:当表结构变化时,同步失败
2024-09-03 23:54:06
场景
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
保存配置,重启集群
最新文章
- 搭建spring mvc项目
- markdown 语法测试
- IIS 7 中设置文件上传大小的方法
- 配置rc.local开机自启动文件的疑问
- CORBA GIOP消息格式学习
- coursera 机器学习课程 GraphLab环境准备
- [AHOI2013]找硬币(搜索)
- PHP判断手机号码是否合法
- C#中DataTable与实体集合通用转换(使用扩展方法)
- SQL Server 2008数据库创建,备份,还原图解及注意点
- supervisor---------------------------------常用
- C#管理异常和错误
- jQuery支持移动Mobile的DOM元素移动和缩放插件
- asp.net 使用HttpModule记录全局错误
- Spring注解基本解读
- 最长回文子串---Manacher算法
- P2P技术概要
- Python小札
- linux路由
- Jenkins+Jmeter持续集成笔记(二:ANT执行Jmeter脚本)