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
    
    

    保存配置,重启集群

  • 相关阅读:
    Python的招牌花旦
    Python的for循环究竟是什么回事儿
    人人都喜欢用的十大python标准库
    有编程基础学python怎么赚点小钱?
    python3 Flask Redis 如何切换数据库
    贪心算法
    【ACM】nyoj_106_背包问题_201308152026
    【ACM】nyoj_14_会场安排问题_201308151955
    【ACM】nyoj_132_最长回文子串_201308151713
    【ACM】nyoj_47_过桥问题_201308151616
  • 原文地址:https://www.cnblogs.com/lillcol/p/15109575.html
Copyright © 2011-2022 走看看