开发者社区> 问答> 正文

动态生成表不能自动创建并进行同步

整个库同步的时候,如果主库创建了新的表,同步就会报错并挂起,报错信息如下:

提问32.png

我的实际使用情况是,每日实时数据量比较大,因此程序会根据来源数据的日期,按模板表clone出当日的新表,并开始保存当天的数据。以后每日以此类推。但是otter对clone出来的新表不能支持动态创建表并进行同步。

所以,希望在以后的版本中会看到此功能的支持,辛苦! 感谢!

原提问者GitHub用户 gewanbo

展开
收起
大圣东游 2023-06-21 17:29:37 95 0
3 条回答
写回答
取消 提交回答
  • 您好,根据您的描述,您使用的是otter进行数据库同步,但是在同步过程中遇到了主库创建新表不能自动同步的问题。这个问题可能是由于otter的配置问题导致的。

    可以尝试在otter配置文件中添加以下参数:

    otter.mysql.schema.defautl.charset=utf8mb4
    otter.mysql.schema.defautl.collation=utf8mb4_general_ci
    

    这个参数可以设置数据库的默认字符集和字符排序规则,如果您的表中存在特殊字符,可能会导致同步失败。如果以上方法无法解决问题,您可以尝试使用其他的数据库同步工具,如canal等。

    另外,如果您需要动态生成表并进行同步,可以考虑使用数据库中的存储过程或触发器来实现动态创建表的功能。这样可以使得新表的创建和同步更加自动化和稳定。

    2023-06-23 14:31:56
    赞同 展开评论 打赏
  • 还得考虑下DDL语句的幂等性处理,比如ddl执行成功了,但没有更新canal位点.

    1、因为ddl语句,不在一个事务头和尾中,不会记录位点 2、执行成功了,但ack到canal失败了

    原回答者GitHub用户agapple

    2023-06-21 18:28:05
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    问题可能是因为otter同步任务启动时只会同步已经存在的表,而不会自动创建新的表。

    解决这个问题的方法是,通过otter提供的ddl.sql文件来手动创建新的表。具体操作步骤如下:

    在otter配置文件中,将canal.instance.tsdb.enable参数设置为false,禁用otter自动创建表的功能。例如:

    Copy canal.instance.tsdb.enable=false

    
    在同步任务的ddl.sql文件中,手动创建新的表。例如:
    
    sql
    Copy
    CREATE TABLE IF NOT EXISTS `new_table` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(50) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    需要注意的是,在创建新表时,建议使用CREATE TABLE IF NOT EXISTS语句,避免重复创建表。
    
    重启otter同步任务,使配置生效。
    
    以上操作完成后,otter同步任务会在启动时自动执行ddl.sql文件中的语句,手动创建新的表。如果在同步过程中出现新的表,也可以通过手动修改ddl.sql文件来同步新的表。
    2023-06-21 17:40:12
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载