---
title: "无主键表迁移机制 | OceanBase 文档中心"
description: 无主键表迁移机制 OMS 支持针对部分数据源进行无主键表迁移，无主键表下将统一用 ROWID 作为主键。 支持无主键表迁移的数据库 源端 目标端 支持的迁移类型 Oracle OB-Oracle * 全量迁移 * 增量数据同步 * 数据校验 OceanBase-MySQL V1.4.7.9版本 OceanBase-M…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

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

# 无主键表迁移机制

更新时间：2023-06-08 10:47:08

OMS 支持针对部分数据源进行无主键表迁移，无主键表下将统一用 ROWID 作为主键。

## 支持无主键表迁移的数据库

| **源端** | **目标端** | **支持的迁移类型** |
| --- | --- | --- |
| Oracle | OB-Oracle | * 全量迁移 * 增量数据同步 * 数据校验 |
| OceanBase-MySQL V1.4.7.9版本 | OceanBase-MySQL V2.2.20及后续版本 | * 全量迁移 * 增量数据同步 * 数据校验 |
| OceanBase 数据库（MySQL 和 Oracle 模式） V2.2.1 版本 | OceanBase 数据库（MySQL 和 Oracle 模式） V2.2.30 版本 | * 全量迁移 * 增量数据同步 * 数据校验 |

## Oracle 到 OB-Oracle 的无主键表迁移机制

OMS 支持基于 Oracle ROWID 和 OceanBase 隐藏列功能实现无主键表的全量迁移和增量数据同步。如果迁移 Oracle 无主键表到 OB-Oracle，OMS 会在结构迁移时自动添加 ROWID 相关隐藏列和约束，并在迁移结束后自动删除相关伪列和索引等约束。

```javascript
ALTER TABLE AAA ADD "OMS_OBJECT_NUMBER" NUMBER INVISIBLE;
ALTER TABLE AAA ADD "OMS_RELATIVE_FNO" NUMBER INVISIBLE;
ALTER TABLE AAA ADD "OMS_BLOCK_NUMBER" NUMBER INVISIBLE;
ALTER TABLE AAA ADD "OMS_ROW_NUMBER" NUMBER INVISIBLE;
ALTER TABLE AAA ADD CONSTRAINT "UK_XXXX" UNIQUE ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER") LOCAL;

```

**注意**

- 以下操作可能导致 Oracle ROWID 产生变化：

     - 导入或导出表。 执行 `ALTER TABLE XXXX MOVE`。
     - 执行 `ALTER TABLE XXXX SHRINK SPACE`。
     - 执行 `FLASHBACK TABLE XXXX`。
     - 分裂分区。
     - 更新一个值，使其移动到一个新的分区。
     - 合并分区。
 - 在使用 ROWID 方式进行数据迁移时，如果有可能导致 ROWID 变化的操作，需要提前通过运维方式规避此风险，即关闭 dba_tables 表属性中的 row movement 参数。 `ROW_MOVEMENT VARCHAR2(8) Whether partitioned row movement is enabled or disabled。`
 - 在业务数据库的切换流程中，也就是业务割接期间，OMS 会自动删除附加的约束。但为了偏于后续业务正常使用，建议手动将每张表的四个伪列也删除掉。

## OceanBase 到 OceanBase 的无主键表迁移机制

OMS 支持迁移 OceanBase（包括 MySQL 和 Oracle）的无主键表到 OceanBase 指定目标库中，基于 OBServer 暴露隐藏主键实现全量迁移和增量数据同步。OceanBase 作为源端时，每张无主键表迁移到目标端之后，都会被附加如下 SQL 语句：

```javascript
ALTER TABLE `DB`.`TABLE` ADD `OMS_PK_INCRMT` bigint;
CREATE UNIQUE INDEX `DB`.`UK_${TABLE}_OBPK_INCRMT` ON `DB`.`TABLE`(`OMS_PK_INCRMT`);

```

**注意**

- 在业务数据库的切换流程中，也就是业务割接期间，OMS 会自动删除基于 ROWID 附加的唯一索引。但为了偏于后续业务正常使用，建议手动将每张表的四个伪列也删除掉。
 - OceanBase V2.2.30 无主键分区表需要基于"分区键+伪列"创建唯一索引。

```javascript
CREATE UNIQUE INDEX "DB"."UK_${TABLE}_OBPK_INCRMT"
ON "DB"."TABLE"("分区键","OMS_PK_INCRMT") local;

```

 上一篇 下一篇 ![有帮助](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) 咨询热线
