zoukankan      html  css  js  c++  java
  • 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
    
    

    保存配置,重启集群

  • 相关阅读:
    Coursera机器学习week11 单元测试
    关于 TypeReference 的解释
    getModifiers 方法解释。
    instanceof isInstance isAssignableFrom 比较
    elasticsearch 基础 语法总结
    kibana 启动 关闭 和进程查找
    MD5 SHA1 SHA256 SHA512 SHA1WithRSA 的区别
    spring boot 项目 热启动
    java zip 压缩文件
    Packet for query is too large (1660 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
  • 原文地址:https://www.cnblogs.com/lillcol/p/15109575.html
Copyright © 2011-2022 走看看