适用场景: OMS 迁移 Oracle 结构数据至 OceanBase 数据库,迁移业务表数量较多,切换阶段删除 UK_$table_name_OMS_ROWID 唯一性约束索引及对应的隐藏列(OMS_OBJECT_NUMBER,OMS_RELATIVE_FNO,OMS_BLOCK_NUMBER,OMS_ROW_NUMBER)耗时长,无法满足割接窗口需求。
问题的原因
OceanBase 数据库 V4.2.x 版本 Oracle 租户中执行 Drop Column 语句默认走快速删列方式,会将列在 Schema 置为 Hidden,修改列名为 SYS_C[COLUMN_ID]_TIME$ 格式,实现快速标记删除。 故耗时瓶颈主要体现为 Drop UK_$table_name_OMS_ROWID,OceanBase 尚不具备 Drop UK 并发 DDL 能力。
优化方式
切换前临时调整租户级别
_publish_schema_mode改成 ASYNC(DROP UK 效率提升 58%),切换完成后恢复至 BEST_EFFORT。调整 RS Leader 与租户 1 号日志流 Leader 同 OBserver 节点(DROP UK 效率提升 20%)。
利用 OceanBase 数据库 Oracle 模式中的删列级联删 UK 能力,仅删除隐藏列(
OMS_OBJECT_NUMBER,OMS_RELATIVE_FNO,OMS_BLOCK_NUMBER,OMS_ROW_NUMBER),消除 Drop UK 耗时(占比约 85%)。
具体实现: 后台拆分多脚本并发删隐藏列,命令如下。
alter table $table_name drop ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER");
适用版本
OceanBase 数据库 V4.2.x 版本。