OceanBase OMS not support create table select as option 错误 解决方法
1 问题现象
OB 集群配置了2套OMS 同步:
1.OB 到OB 同步。
2.OB 到 MySQL 同步。
在OB源端通过CTAS 创建了一张表,然后OMS 同步异常,查看OMS日志,报错如下:
[ not support create table select as option, origin sql:/ ApplicationName=DBeaver 23.2.0 - SQLEditor
/ create table cndba.dave as select * from cndba.dave2 where 1=2 Caused by: java.lang.RuntimeException: table ambiguous, table:dave,db:ob.cndba
2 问题分析
OB 用的是开源的版本,所以是MySQL模式。 在MySQL中,启用GTID后,也是不支持CTAS语法的,因为CTAS会生成两个sql,一个是DDL创建表SQL,一个是insert into 插入数据的sql。由于DDL会导致自动提交,所以这个sql至少需要两个GTID,但是GTID模式下,只能给这个sql生成一个GTID 。
但是在OB的MySQL 模式下,是可以执行CTAS 语法的,但是OMS 同步软件不支持,即使是目前最新的OMS 4.1.1版本。
3 解决方法
3.1 解决当前问题
因为当前已经触发了错误,需要通过跳表的操作来解决当前问题。
两个步骤:
1.在目标端手工创建好空表。
2.在OMS 配置跳表。
建表操作省略,在OMS 配置文件中修改JDBCWriter.coordinatorFile.skipDdl 选项,添加如下内容:
[“create table cndba.dave”]
然后重启OMS 同步任务。 然后OMS 就会恢复正常同步,因为这里只能控制ddl,后续的DML还是会继续同步过去。
3.2 规避方法
虽然OB支持CTAS,但是在生产环境,尤其是涉及到OMS同步的情况下,还是禁止使用该语法:
create table cndba.dave as select * from cndba.dave2 where 1=2;
可以将该CTAS 拆解为两部分:
1.create table 表A like 表B ;
2.insert into 表A select *from 表B ;
这样就不会影响到同步了:
mysql> create table cndba.ustc like cndba.dave2;
mysql> insert into cndba.ustc select * from cndba.dave2;
版权声明:本文为博主原创文章,未经博主允许不得转载。