问题描述
部分场景下有些事务管理器(TM)需要同时访问 OceanBase 数据库和 Oracle。这些 TM 会有一些内部实现去校验 OceanBase 数据库和 Oracle 之间的表结构是否相同,从而保证事务能在 OceanBase 数据库和 Oracle 都执行成功。但是 OceanBase 数据库的系统表 all_tab_columns 和 Oracle 有比较大的差异。
OceanBase 数据库的
all_tab_columns没有保存 view 的列元数据,但是 Oracle 会有。OceanBase 数据库的
all_tab_columns中字段的data_length与 Oracle 表现为不一致。
适用版本
OceanBase V2.x 和 V3.x 版本。
解决方法
问题一
在 OceanBase 数据库新建一张实体表
ob_all_tab_columns,使用 DATAX 从 Oracle 同步 view 的列元数据到 OceanBase 数据库。在业务用户下新建all_tab_columns视图,类似如下。obclient > select * from ob_all_tab_columns union all select * from all_tab_columns;问题二
在上文视图上做不兼容的逻辑转换,比如 OceanBase 数据库目前对于 varchar2 是允许长度超过 4000(即
max_string_size='EXTENDED'),而 Oracle 默认max_string_size='STANDARD',不允许超过 4000。这样对于字段数据类型定义成 varchar2(2001 char),并且编码为 GBK 的场景下,Oracle 的data_length是 4000,而 OceanBase 数据库是 4002。修改视图定义,类似如下。
obclient > select * from ob_all_tab_columns union all select min(data_length,4000) from all_tab_columns;