作者简介:陈世岚,瑞蓝创数据库工程师
原创内容未经授权不得随意使用,转载请联系小编并注明来源
问题现象
触发场景:OMS 4.3.2 全量迁移,源端和目标端均为 OBOracle 租户,对同一张表进行迁移时,切片索引选择在不同链路配置下表现不一致。
具体表现:
-
单链路配置四个表时,表
SCH1.TBL_01的切片索引选择__pk_increment(无主键增量列),因表实际无该字段导致迁移报错卡住 -
单链路配置单个表(同一张表)时,切片索引正常选择主键
PK_TBL_01,迁移可正常进行 -
本质是 OMS meta-query 在识别表约束时,无法正确区分同名的 PK(主键)和 UK(唯一约束)
影响范围:所有在 OBOracle 源端同时存在同名 PK 和 UK 约束的表,在全量迁移时可能出现切片索引选择异常,导致迁移任务卡住。
发生频率:必现(只要同一张表存在同名 PK 和 UK 约束,且该表在单链路多表场景下被元数据查询判定为"无主键表"时触发)
问题原因
根因分析:
OBOracle 允许对同一张表创建同名的 PK 约束和 UK 约束,导致系统视图 ALL_CONSTRAINT 和 ALL_CONS_COLUMNS 中 CONSTRAINT_NAME 相同,外部查询无法通过名称区分主键和唯一约束。OMS meta-query 返回结果时,P(主键)和 U(唯一约束)哪个在结果集中靠后,哪个就被当作最终结果。
技术原理:
-
OMS 全量迁移时,需要通过 meta-query 查询源端表的约束信息,确定切片索引(用于并行分片读取数据)。 -
当查询到表有主键(PK)约束时,OMS 优先使用主键作为切片索引。 -
当查询到表"无主键"时,OMS 回退使用 __pk_increment(增量列)作为切片索引。 -
由于 PK 和 UK 同名,meta-query 返回结果集的顺序不确定(取决于字典序或查询返回顺序): -
如果 UK 记录排在 PK 记录之后 → meta-query 认为该表无主键 → 使用 __pk_increment→ 报错 -
如果 PK 记录排在 UK 记录之后 → meta-query 正确识别主键 → 正常迁移 -
查询结果顺序可能受链路中表数量、查询并发等因素影响,导致同一张表在不同链路配置下表现不一致。
对比 Oracle 行为:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
-- STEP 1: 创建无主键表
CREATE TABLE test_tab (
col1 NUMBER(10),
col2 VARCHAR2(100),
col3 DATE DEFAULT SYSDATE
);
-- STEP 1: 创建无主键表
CREATE UNIQUE INDEX idx_test_tab_uq_pk ON test_tab(col1);
-- STEP 2: 将 col1/col2 修改为主键
ALTER TABLE test_tab ADD CONSTRAINT idx_test_tab_uq_pk PRIMARY KEY (col1/col2);
-- STEP 3: 查看表的完整 DDL
SELECT DBMS_METADATA.GET_DDL('TABLE', 'TEST_TAB') AS ddl FROM DUAL;
相同列上创建同名 PK + UK
不同列上创建同名 PK + UK
关键信息
诊断方法
查看 OMS 全量迁移组件的切片索引选择
在 OMS 控制台 → 迁移链路 → 全量迁移组件详情中,查看表的切片索引选择结果:
-
正常情况:切片索引 = 主键名称 -
异常情况:切片索引 = __pk_increment
问题的风险及影响
业务影响程度:高。全量迁移卡住导致整个迁移链路无法推进,阻塞数据迁移项目进度。
系统风险评估:中。仅影响存在同名 PK/UK 约束的特定表,其他表的迁移不受影响。
数据丢失风险:无。问题发生在全量迁移阶段,源端数据完整。
适用版本
受影响版本:OMS 4.3.2(OBOracle → OBOracle 全量迁移场景)
解决方法
目前提供:删除源端同名 UK 约束
在源端 OBOracle 租户中,删除与 PK 同名的 UK 约束,仅保留 PK 约束:
-- 删除同名的唯一约束
ALTER TABLE SCH1.TBL_01 DROP CONSTRAINT ;
注意:操作前需确认该 UK 约束的业务必要性,确保删除后不影响源端业务逻辑。 >
根本解决
待 OBOracle 内核修复同名 PK/UK 约束在系统视图中的返回结果,确保 meta-query 能正确区分主键和唯一约束。
规避方式
在 OBOracle 租户中避免创建与主键同名的唯一约束。若业务需要唯一性保证,可直接依赖主键(主键本身就具备唯一性)。
若需要唯一约束,建议使用与主键不同的约束名称(如 PK_xxx 和 UK_xxx),避免同名。
END
瑞蓝创 OceanBase OBCP V4 精英训练营
点击下方图片立即了解详情


▼ 点击「阅读原文」,了解更多产品技术文章


