首批通过分布式安全可靠测评,为关键业务系统打造
数据迁移服务隐藏列机制说明
更新时间:2026-05-14 11:20:50
OceanBase 迁移服务(OceanBase Migration Service,OMS)进行结构迁移或增量同步 DDL 时,会根据数据迁移任务的实际情况,提供相应的机制。
背景信息
为了确保数据迁移的一致性,OMS 会在结构迁移、增量同步 DDL 步骤为目标端的对应表添加隐藏列,并基于隐藏列创建唯一索引,对应的列和索引将在正向切换步骤被自动移除。支持添加隐藏列的源端、目标端和表的类型如下表所示,不同数据源类型查询有主键或非空唯一键的表的 SQL 语句详情请参见 查询数据库对象。
| 源端 | 目标端 | 表的类型 |
|---|---|---|
| Oracle 数据库 | OceanBase 数据库 Oracle 兼容模式 | OMS V4.3.0 及之后版本,默认支持无非空唯一键表。如果您需要支持非空唯一键表,请在 系统参数 页面调整参数 invisible_column_uk_enabled.with_pk_or_not_null_uk 为 true。详情请参见 修改系统参数。 |
| OceanBase 数据库 MySQL 兼容模式 | OceanBase 数据库 MySQL 兼容模式 | 无非空唯一键表 |
| OceanBase 数据库 Oracle 兼容模式 | OceanBase 数据库 Oracle 兼容模式 | 无非空唯一键表 |
| OceanBase 数据库 Oracle 兼容模式 | Oracle 数据库 | 无非空唯一键表 |
| Oracle 数据库 | OceanBase 数据库 MySQL 兼容模式 | 无非空唯一键表 |
对于上述支持无非空唯一键表添加隐藏列的数据迁移任务,OMS V4.3.0 及之后版本在创建任务的 迁移选项 > 高级选项 步骤提供 无非空唯一键表增加隐藏列 选项,您可以灵活选择是否配置隐藏列来保证无非空唯一键表迁移的一致性。

Oracle 数据库至 OceanBase 数据库 Oracle 兼容模式的数据迁移
添加隐藏列
ALTER TABLE "{schema}"."{table}" ADD "OMS_OBJECT_NUMBER" NUMBER INVISIBLE; ALTER TABLE "{schema}"."{table}" ADD "OMS_RELATIVE_FNO" NUMBER INVISIBLE; ALTER TABLE "{schema}"."{table}" ADD "OMS_BLOCK_NUMBER" NUMBER INVISIBLE; ALTER TABLE "{schema}"."{table}" ADD "OMS_ROW_NUMBER" NUMBER INVISIBLE;添加唯一索引
// 有分区字段 CREATE UNIQUE INDEX "{schema}"."UK_{table}_OMS_ROWID" ON "{schema}"."{table}" ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER", "{partition_col_0}", "{partition_col_1}") LOCAL; // 没有分区字段 CREATE UNIQUE INDEX "{schema}"."UK_{table}_OMS_ROWID" ON "{schema}"."{table}" ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER");删除唯一索引
DROP INDEX "{schema}"."UK_{table}_OMS_ROWID";删除隐藏列
ALTER TABLE "{schema}"."{table}" DROP ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER");
OceanBase 数据库 MySQL 兼容模式之间的数据迁移
添加列
ALTER TABLE `{schema}`.`{table}` ADD COLUMN `OMS_PK_INCRMT` BIGINT;添加唯一索引
// 有分区字段 CREATE UNIQUE INDEX `UK_{table}_OBPK_INCRMT` ON `{schema}`.`{table}` (`{partition_col_0}`, `{partition_col_1}`, `OMS_PK_INCRMT`) LOCAL; // 没有分区字段 CREATE UNIQUE INDEX `UK_{table}_OBPK_INCRMT` ON `{schema}`.`{table}` (`OMS_PK_INCRMT`);删除唯一索引
DROP INDEX `UK_{table}_OBPK_INCRMT` ON `{schema}`.`{table}`;删除列
ALTER TABLE `{schema}`.`{table}` DROP COLUMN `OMS_PK_INCRMT`;
OceanBase 数据库 Oracle 兼容模式之间的数据迁移
添加隐藏列
ALTER TABLE "{schema}"."{table}" ADD "OMS_PK_INCRMT" NUMBER INVISIBLE;添加唯一索引
// 有分区字段 CREATE UNIQUE INDEX "{schema}"."UK_{table}_OBPK_INCRMT" ON "{schema}"."{table}"("{partition_col_0}", "{partition_col_1}", "OMS_PK_INCRMT") LOCAL; // 没有分区字段 CREATE UNIQUE INDEX "{schema}"."UK_{table}_OBPK_INCRMT" ON "{schema}"."{table}"("OMS_PK_INCRMT");删除唯一索引
DROP INDEX "{schema}"."UK_{table}_OBPK_INCRMT";删除隐藏列
ALTER TABLE "{schema}"."{table}" DROP COLUMN "OMS_PK_INCRMT";
OceanBase 数据库 Oracle 兼容模式至 Oracle 数据库的数据迁移
添加隐藏列
// Oracle 数据库 12C 之前版本 ALTER TABLE "{schema}"."{table}" ADD "OMS_PK_INCRMT" NUMBER; // Oracle 数据库 12C 及之后版本 ALTER TABLE "{schema}"."{table}" ADD "OMS_PK_INCRMT" NUMBER INVISIBLE;添加唯一索引
// 有分区字段 CREATE UNIQUE INDEX "{schema}"."{table}" ON "{schema}"."{table}"("{partition_col_0}", "{partition_col_1}", "OMS_PK_INCRMT") LOCAL; // 没有分区字段 CREATE UNIQUE INDEX "{schema}"."{table}" ON "{schema}"."{table}"("OMS_PK_INCRMT");删除唯一索引
DROP INDEX "{schema}"."{table}";删除隐藏列
ALTER TABLE "{schema}"."{table}" DROP COLUMN "OMS_PK_INCRMT";
Oracle 数据库至 OceanBase 数据库 MySQL 兼容模式的数据迁移
添加列
ALTER TABLE `{schema}`.`{table}` ADD COLUMN `OMS_OBJECT_NUMBER` BIGINT; ALTER TABLE `{schema}`.`{table}` ADD COLUMN `OMS_RELATIVE_FNO` BIGINT; ALTER TABLE `{schema}`.`{table}` ADD COLUMN `OMS_BLOCK_NUMBER` BIGINT; ALTER TABLE `{schema}`.`{table}` ADD COLUMN `OMS_ROW_NUMBER` BIGINT;添加唯一索引
// 有分区字段 CREATE UNIQUE KEY `UK_{table}_OMS_ROWID` (`OMS_OBJECT_NUMBER`, `OMS_RELATIVE_FNO`, `OMS_BLOCK_NUMBER`, `OMS_ROW_NUMBER`, `{partition_col_0}`, `{partition_col_1}`) LOCAL; // 没有分区字段 CREATE UNIQUE KEY `UK_{table}_OMS_ROWID` (`OMS_OBJECT_NUMBER`, `OMS_RELATIVE_FNO`, `OMS_BLOCK_NUMBER`, `OMS_ROW_NUMBER`);删除唯一索引
DROP INDEX UK_{table}_OMS_ROWID ON {table};删除列
ALTER TABLE `{schema}`.`{table}` DROP COLUMN `OMS_OBJECT_NUMBER`, DROP COLUMN `OMS_RELATIVE_FNO`, DROP COLUMN `OMS_BLOCK_NUMBER`, DROP COLUMN `OMS_ROW_NUMBER`;
常见问题
如何处理分区
"{partition_col_0}" 或者 `{partition_col_0}` 为表分区字段,可能存在多个。存在多个时,请使用英文逗号(,)分隔。例如,
"{partition_col_0}", "{partition_col_1}","{partition_col_2}"或 `{partition_col_0}`,`{partition_col_1}`,`{partition_col_2}`。{schema}、{table}、{partition_col_0}、{partition_col_1} 分别为库名、表名、分区字段名、分区字段名的占位符。
如何设置注释的语言
如果您需要设置 OMS 创建隐藏列时注释使用的语言,可以进行以下操作:
登录 OMS 容器。
docker exec -it ${CONTAINER_NAME} bash注意
CONTAINER_NAME为创建容器的名称。在
/home/admin/conf/rm/目录下,配置application-oms.properties文件中default.language参数的值。default.language参数不配置或配置值为zh-CN:结构迁移和增量同步 DDL 的无主键表隐藏列的注释为中文。default.language参数配置值为en-US:结构迁移或增量同步 DDL 的无主键表隐藏列的注释为英文。
重启 Console。
supervisorctl restart oms_console同步修改
/home/admin/conf/rm/application-oms_template.properties中default.language的值。否则重启 OMS 容器时,application-oms.properties中的default.language会被初始化为默认值。