---
title: Oracle 迁移到 OceanBase 数据库常见不兼容对象的处理方式-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于Oracle 迁移到 OceanBase 数据库常见不兼容对象的处理方式相关的常见问题和使用技巧，帮助您快速解决Oracle 迁移到 OceanBase 数据库常见不兼容对象的处理方式的难题。
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

划线反馈

# Oracle 迁移到 OceanBase 数据库常见不兼容对象的处理方式

更新时间：2026-07-24 10:01

适用版本： V2.2.x、V3.1.x、V3.2.x 内容类型：TechNote  

在从 Oracle 数据库迁移到 OceanBase 数据库 Oracle 模式的过程中，会遇到一些特殊语法或对象需要单独处理。本文介绍遇到的一些不完全兼容对象的处理逻辑。

## 适用版本

OceanBase 数据库 V2.x、V3.x 版本。

## Oracle 中 LOB 数据迁移到 OceanBase 数据库时的处理逻辑

Oracle 中 CLOB 和 BLOB 类型均可达到 4G 大小（以 Oracle 11.2 为例），而 OceanBase 数据库当前版本（V3.2.3.x）所支持的大对象数据类型的信息如下表所示。

| 类型 | 长度 | 定义上限 | 字符集 |
| --- | --- | --- | --- |
| BLOB | 变长 | 48MB | BINARY |
| CLOB | 变长 | 48MB | 与租户字符集一致 |

考虑到从 Oracle 迁移到 OceanBase 数据库，如果涉及 LOB 字段，可能会存在当 LOB 数据大于 48M 时数据丢失的问题，需要提前发现这类数据并进行处理。

1. 找到 Oracle 数据库表中 LOB 数据的最大长度。

   ```shell
   SELECT MAX(DBMS_LOB.GETLENGTH(C_CLOB)) AS LONGEST_CLOB,
   MAX(DBMS_LOB.GETLENGTH(C_BLOB)) AS LONGEST_BLOB
   FROM T_LOB;

   ```
 2. 获取整个数据库中 LOB 字段值较大的清单。

   ```shell
   SELECT COL.OWNER,
   COL.TABLE_NAME,
   COL.COLUMN_NAME,
   COL.DATA_TYPE,
   COL.AVG_COL_LEN,
   COL.CHAR_LENGTH,
   TAB.NUM_ROWS
   FROM DBA_TABLES TAB, DBA_TAB_COLUMNS COL
   WHERE TAB.OWNER = COL.OWNER
   AND TAB.TABLE_NAME = COL.TABLE_NAME
   AND COL.DATA_TYPE IN ('CLOB', 'BLOB')
   AND COL.OWNER NOT IN ('SYS', 'SYSTEM')
   AND COL.OWNER IN
   (SELECT USERNAME FROM DBA_USERS WHERE ACCOUNT_STATUS = 'OPEN')
   AND COL.TABLE_NAME NOT LIKE 'BIN%';

   ```

## Oracle 中 disable 约束在 OMS 迁移过程中的处理逻辑

在对 Oracle 中的约束类非表对象做一致性校验时，发现部分约束在 OMS 迁移完成后丢失了，需要分析其 OMS 丢失的原因。

- 问题分析

  从 OMS 界面中获取 DDL 的语句可以看到有 2 个 WARN，且类型是 DISCARD，表示 OMS 判断其是 disable 状态的约束，直接选择了舍弃掉。

  ```shell
  -- [WARN] [DISCARD] CONSTRAINT "PK_T_PARTKEY_IS_PK" PRIMARY KEY ("CRT_DTTM") DISABLE NOVALIDATE -> [NULL]
  -- [WARN] [DISCARD] CHECK ("ACT_ID" IS NOT NULL) DISABLE NOVALIDATE -> [NULL]
  CREATE TABLE "T_PARTKEY_IS_PK" (
  "ACT_ID" NUMBER(10,0),
  "SRT_ID" NUMBER(10,0),
  "SRT_ORIGNAL_ID" NUMBER(10,0),
  "CRT_DTTM" DATE,
  "LASTUPT_DTTM" DATE
  )

  ```
 - 问题结论

  Oracle 侧处于 Disable 状态的约束通过 OMS 迁移时，会被舍弃，不会在 OceanBase 数据库侧创建，在对约束对象比对时，需要额外注意 Oracle 端约束的 status 是否处于 disable 状态，本身对业务和功能没有影响。

  可以通过以下语句观测源端 Oracle 约束状态。

  ```shell
  -- 手工将 T_PARTKEY_IS_PK 表的约束都 disable
  ALTER TABLE ZHENXING.T_PARTKEY_IS_PK DISABLE NOVALIDATE CONSTRAINT PK_T_PARTKEY_IS_PK;
  ALTER TABLE ZHENXING.T_PARTKEY_IS_PK DISABLE CONSTRAINT SYS_C0011109;

  SELECT OWNER,
  TABLE_NAME,
  CONSTRAINT_NAME,
  CONSTRAINT_TYPE,
  INDEX_NAME,
  STATUS
  FROM DBA_CONSTRAINTS
  WHERE OWNER = 'ZHENXING'
  AND TABLE_NAME = 'T_PARTKEY_IS_PK';

  ```

## Oracle 中分区表迁移到 OceanBase 后，带有的自动分区属性丢失

自动分区属性是 Oracle 11g 的特性，可以用 INTERVAL 语法基于天、月、年做自动分区创建。 示例如下：

```shell
create table interval_sales (
prod_id number(6),
time_id date)
partition by range (time_id)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
(partition p1 values less than (to_date('2015-01-01','yyyy-mm-dd')));

```

在通过 OMS 迁移到 OceanBase 数据库后，发现自动分区属性丢失了，会导致当分区未自动创建时导致新增数据没法写入分区表，导致报错。

- 问题分析

  从 OMS 界面中获取 DDL 的语句可以看到有 1 个 WARN，且类型是 DISCARD，表示 OMS 判断其不完全兼容，直接选择了舍弃掉。

  ```shell
  -- OMS 迁移表结构时记录的 WARN 信息，表示自动分区属性由于不兼容会自动 DISCARD 舍弃
  [WARN] [DISCARD]  INTERVAL (NUMTOYMINTERVAL (1,'MONTH')) -> [NULL]

  在 Oracle 迁移到 OceanBase 数据库前，需要把 Oracle 端存在自动分区属性的表提前找出，避免由于迁移到 OceanBase 数据库后分区为未自动创建导致的数据无法插入的报错，并且找出这类分区后，先在 Oracle 端创建足够的多分区，避免迁移过程中源端分区数增加导致比对不一致的情况。并记录清单告知业务开发待后续用其他方式定期生成新分区。

### 如何找出 Oracle 中自动分区的表

```shell
/*
PARTITION_COUNT: Number of partitions in the table. For interval partitioned tables, the value of this column is always 1048575.
*/
SELECT T1.OWNER,
T1.TABLE_NAME,
T1.INTERVAL,
T1.PARTITIONING_TYPE,
T1.PARTITION_COUNT,
T1.SUBPARTITIONING_TYPE      AS SUB_TYPE,
T1.SUBPARTITIONING_KEY_COUNT SUB_COUNT,
T1.STATUS
FROM DBA_PART_TABLES T1
WHERE 1 = 1
AND TABLE_NAME NOT LIKE 'BIN%'
AND (INTERVAL IS NOT NULL OR PARTITION_COUNT = 1048575);

```

上一篇

[UDF 在 information_schema 中可见其他用户 DDL 的兼容性差异分析](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000006830279)

下一篇

[OceanBase 数据库 MySQL 租户对象大小写默认值](https://www.oceanbase.com/knowledge-base/oceanbase-database-20000000017) ![有帮助](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) 咨询热线
