---
title: "数据迁移服务隐藏列机制说明 | OceanBase 文档中心"
description: 数据迁移服务隐藏列机制说明 OceanBase 迁移服务（OceanBase Migration Service，OMS）进行结构迁移或增量同步 DDL 时，会根据数据迁移任务的实际情况，提供相应的机制。 背景信息 为了确保数据迁移的一致性，OMS 会在结构迁移、增量同步 DDL 步骤为目标端的对应表添加隐藏列，并基…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*L03BS6f-o40AAAAAAAAAAAAADiGDAQ/original) 迁移服务 OMSV 4.3.1 企业版

# 数据迁移服务隐藏列机制说明

更新时间：2026-05-14 11:20:50

OceanBase 迁移服务（OceanBase Migration Service，OMS）进行结构迁移或增量同步 DDL 时，会根据数据迁移任务的实际情况，提供相应的机制。

## 背景信息

为了确保数据迁移的一致性，OMS 会在结构迁移、增量同步 DDL 步骤为目标端的对应表添加隐藏列，并基于隐藏列创建唯一索引，对应的列和索引将在正向切换步骤被自动移除。支持添加隐藏列的源端、目标端和表的类型如下表所示，不同数据源类型查询有主键或非空唯一键的表的 SQL 语句详情请参见 [查询数据库对象](https://www.oceanbase.com/docs/enterprise-oms-doc-cn-1000000004023072)。

| 源端 | 目标端 | 表的类型 |
| --- | --- | --- |
| Oracle 数据库 | OceanBase 数据库 Oracle 兼容模式 | OMS V4.3.0 及之后版本，默认支持无非空唯一键表。如果您需要支持非空唯一键表，请在 **系统参数** 页面调整参数 `invisible_column_uk_enabled.with_pk_or_not_null_uk` 为 `true`。详情请参见 [修改系统参数](https://www.oceanbase.com/docs/enterprise-oms-doc-cn-1000000004023126)。 |
| OceanBase 数据库 MySQL 兼容模式 | OceanBase 数据库 MySQL 兼容模式 | 无非空唯一键表 |
| OceanBase 数据库 Oracle 兼容模式 | OceanBase 数据库 Oracle 兼容模式 | 无非空唯一键表 |
| OceanBase 数据库 Oracle 兼容模式 | Oracle 数据库 | 无非空唯一键表 |
| Oracle 数据库 | OceanBase 数据库 MySQL 兼容模式 | 无非空唯一键表 |

对于上述支持无非空唯一键表添加隐藏列的数据迁移任务，OMS V4.3.0 及之后版本在创建任务的 **迁移选项** > **高级选项** 步骤提供 **无非空唯一键表增加隐藏列** 选项，您可以灵活选择是否配置隐藏列来保证无非空唯一键表迁移的一致性。

![oms68-zh](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/oms/oms-enterprise/oms68-zh.png)

## Oracle 数据库至 OceanBase 数据库 Oracle 兼容模式的数据迁移

- 添加隐藏列

  ```sql
  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;

  ```
 - 添加唯一索引

  ```sql
  // 有分区字段
  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");

  ```
 - 删除唯一索引

  ```sql
  DROP INDEX "{schema}"."UK_{table}_OMS_ROWID";

  ```
 - 删除隐藏列

  ```sql
  ALTER TABLE "{schema}"."{table}" DROP ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER");

  ```

## OceanBase 数据库 MySQL 兼容模式之间的数据迁移

- 添加列

  ```sql
  ALTER TABLE `{schema}`.`{table}` ADD COLUMN `OMS_PK_INCRMT` BIGINT;

  ```sql
  // 有分区字段
  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`);

  ```sql
  DROP INDEX `UK_{table}_OBPK_INCRMT` ON `{schema}`.`{table}`;

  ```
 - 删除列

  ```sql
  ALTER TABLE `{schema}`.`{table}` DROP COLUMN `OMS_PK_INCRMT`;

  ```

## OceanBase 数据库 Oracle 兼容模式之间的数据迁移

- 添加隐藏列

  ```sql
  ALTER TABLE "{schema}"."{table}" ADD "OMS_PK_INCRMT" NUMBER INVISIBLE;

  ```sql
  // 有分区字段
  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");

  ```sql
  DROP INDEX "{schema}"."UK_{table}_OBPK_INCRMT";

  ```sql
  ALTER TABLE "{schema}"."{table}" DROP COLUMN "OMS_PK_INCRMT";

  ```

## OceanBase 数据库 Oracle 兼容模式至 Oracle 数据库的数据迁移

- 添加隐藏列

  ```sql
  // Oracle 数据库 12C 之前版本
  ALTER TABLE "{schema}"."{table}" ADD "OMS_PK_INCRMT" NUMBER;
  // Oracle 数据库 12C 及之后版本
  ALTER TABLE "{schema}"."{table}" ADD "OMS_PK_INCRMT" NUMBER INVISIBLE;

  ```sql
  // 有分区字段
  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");

  ```sql
  DROP INDEX "{schema}"."{table}";

  ```

## Oracle 数据库至 OceanBase 数据库 MySQL 兼容模式的数据迁移

- 添加列

  ```sql
  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;

  ```sql
  // 有分区字段
  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`);

  ```sql
  DROP INDEX UK_{table}_OMS_ROWID ON {table};

  ```
 - 删除列

  ```sql
  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 创建隐藏列时注释使用的语言，可以进行以下操作：

1. 登录 OMS 容器。

   ```shell
   docker exec -it ${CONTAINER_NAME} bash

   ```

   #### 注意

   `CONTAINER_NAME` 为创建容器的名称。
 2. 在 `/home/admin/conf/rm/` 目录下，配置 `application-oms.properties` 文件中 `default.language` 参数的值。

      - `default.language` 参数不配置或配置值为 `zh-CN`：结构迁移和增量同步 DDL 的无主键表隐藏列的注释为中文。
      - `default.language` 参数配置值为 `en-US`：结构迁移或增量同步 DDL 的无主键表隐藏列的注释为英文。
 3. 重启 Console。

   ```bash
   supervisorctl restart oms_console

   ```
 4. 同步修改 `/home/admin/conf/rm/application-oms_template.properties` 中 `default.language` 的值。否则重启 OMS 容器时，`application-oms.properties` 中的 `default.language` 会被初始化为默认值。

## 相关文档

- [迁移 Oracle 数据库的数据至 OceanBase 数据库 Oracle 兼容模式](https://www.oceanbase.com/docs/enterprise-oms-doc-cn-1000000004023022)
 - [OceanBase 数据库之间的数据迁移](https://www.oceanbase.com/docs/enterprise-oms-doc-cn-1000000004023023)
 - [迁移 OceanBase 数据库 Oracle 兼容模式的数据至 Oracle 数据库](https://www.oceanbase.com/docs/enterprise-oms-doc-cn-1000000004023040)
 - [迁移 Oracle 数据库的数据至 OceanBase 数据库 MySQL 兼容模式](https://www.oceanbase.com/docs/enterprise-oms-doc-cn-1000000004023032)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
