---
title: 无主键 BLOB 表反向增量数据一致性问题-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于无主键 BLOB 表反向增量数据一致性问题相关的常见问题和使用技巧，帮助您快速解决无主键 BLOB 表反向增量数据一致性问题的难题。
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

划线反馈

# 无主键 BLOB 表反向增量数据一致性问题

更新时间：2026-08-25 02:41

适用版本： V4.2.x 内容类型：Troubleshoot  

## 问题现象

客户在进行 Oracle 11g 到 OceanBase 4.2.5 的数据库迁移时，选择了包含反向增量的完整迁移链路（结构 + 全量 + 增量 + 切换 + 反向）。这意味着：

- **正向迁移**：将数据从 Oracle 迁移至 OceanBase，并将业务切换至 OceanBase。
 - **反向增量**：业务在 OceanBase 上运行后，将 OceanBase 产生的新变更实时同步回 Oracle，以便在 OceanBase 出现问题时可以快速回切。

客户在 OCP 上配置完链路并勾选“反向增量”后，执行预检查，系统报告了两个警告。

## 问题原因

### 根因分析

#### 问题一：无主键且包含 LOB 字段的表

预检查提示：部分表没有主键且包含 BLOB 等大对象（LOB）字段，在反向增量同步时可能存在数据质量问题。

理解此警告需要了解 OMS 增量同步定位变更行的机制：

- 增量同步通过解析数据库日志来捕获变更。
 - 当日志记录了一条 UPDATE 或 DELETE 操作时，OMS 需要确定具体是哪一行数据发生了变更。
 - **有主键时**：可以直接使用主键值在目标端精确查找对应行。
 - **无主键时**：OMS 缺少唯一的行标识，定位变更行时可能出现偏差。

在正向迁移（Oracle -> OceanBase）时，OMS 可以为 OceanBase 端的无主键表添加隐藏列以辅助同步。然而，这些隐藏列在 Oracle 源端并不存在。因此，在反向增量同步（OceanBase -> Oracle）时，OMS 仍需依赖 Oracle 源表本身的主键或非空唯一索引来定位行。

对于无主键且包含 LOB 字段的表，反向增量同步可能导致以下问题：

- 将 BLOB 数据更新到错误的行（数据覆盖）。
 - 无法找到对应的行（数据丢失）。
 - 同一条变更被重复应用（数据重复）。

BLOB/CLOB 等大对象字段数据量大、处理逻辑复杂，一旦定位错误，其后果比普通字段更为严重。因此系统会针对此场景发出警告。

**为什么其他无主键表没有报告此警告？**

其他无主键表不包含 LOB 大字段。对于仅包含普通字段的表，即使没有主键，OMS 在反向同步时可以通过“所有列的值组合”等方式来定位行，风险相对可控。但 LOB 字段特殊，系统对此场景的检查更为严格。

**关于联合唯一键（UK）的疑问**

客户提出：表虽然没有主键，但有一个两列的联合唯一键（UK），为什么仍然报告此警告？

OMS 在此处要求的“主键”，实际上指的是“主键或非空唯一索引”。一个唯一键要被 OMS 认可用于行定位，必须满足两个条件：

1. 是唯一索引（UK 满足此条件）。
 2. 所有列都是 NOT NULL 的（许多 UK 不满足此条件）。

如果 UK 中的列允许为 NULL，由于在数据库层面 `NULL != NULL`，该 UK 无法保证行的唯一性，因此 OMS 无法安全地将其作为主键使用。

客户的联合 UK 因为两列均未指定为 NOT NULL，NULL 值不参与唯一性比较，导致 OMS 无法依赖它来可靠地定位唯一行，因此该表仍被判定为“无主键”表。

#### 问题二：触发器警告

预检查时还报告了一个关于触发器的警告。客户理解此警告可以忽略，在正向切换时禁用 Oracle 源端的触发器即可。

客户的理解是正确的。补充说明如下：

- OMS 4.3.0 支持在正向迁移时将 Oracle 的触发器迁移到 OceanBase 目标端。
 - 但是，反向增量同步是从 OceanBase 到 Oracle，OMS 不支持将 OceanBase 端的触发器同步回 Oracle。
 - 在反向增量同步期间，如果 Oracle 源端原有的触发器仍处于启用状态，当 OMS 将数据写回 Oracle 时，可能会触发这些源端触发器，导致数据被二次修改，从而引发数据不一致。
 - 因此，正确的做法是：在正向迁移切换阶段，等待 OMS 将触发器迁移到 OceanBase 目标端后，手动禁用 Oracle 源端的触发器。这样反向增量同步就不会受到触发器的影响。

**是否为已知问题/Bug？**

否。这是 OMS 双向同步机制与 Oracle/OceanBase 数据库行为差异导致的设计限制，属于正常的预检查告警，并非产品 Bug。

## 关键信息

### 诊断命令及预期结果

#### 检查无主键且包含 LOB 字段的表

在 Oracle 源端执行以下 SQL 查询：

```sql
SELECT owner, table_name, column_name, data_type
FROM dba_tab_columns
WHERE data_type IN ('BLOB', 'CLOB', 'NCLOB', 'LONG RAW')
  AND owner = 'YOUR_SCHEMA'
  AND table_name IN (
      SELECT table_name FROM dba_tables
      WHERE owner = 'YOUR_SCHEMA'
      MINUS
      SELECT table_name FROM dba_constraints
      WHERE owner = 'YOUR_SCHEMA' AND constraint_type = 'P'
  );

```

- **预期结果为空**：表示没有无主键且包含 LOB 字段的表，预检查不会报告第一类警告。
 - **返回记录**：表示存在此类表，需要在 OMS 链路配置中特别关注或进行表结构改造。

#### 检查联合唯一键（UK）的列是否非空

在 Oracle 源端执行以下 SQL 查询：

```sql
SELECT index_name, column_name, nullable
FROM dba_ind_columns ic
JOIN dba_tab_columns tc ON ic.table_name = tc.table_name
                        AND ic.column_name = tc.column_name
WHERE ic.table_name = 'YOUR_TABLE'
  AND ic.index_name IN (
      SELECT index_name FROM dba_indexes
      WHERE uniqueness = 'UNIQUE'
  );

```

- **存在 `NULLABLE='Y'` 的记录**：表示该 UK 包含可为空的列，OMS 不会将其作为有效的主键替代。
 - **全部为 `NULLABLE='N'`**：表示该 UK 所有列均为非空，OMS 可将其识别为有效的唯一索引用于行定位。

#### 检查 Oracle 源端启用的触发器

在 Oracle 源端执行以下 SQL 查询：

```sql
SELECT owner, trigger_name, table_name, status
FROM dba_triggers
WHERE owner = 'YOUR_SCHEMA'
  AND status = 'ENABLED';

```

- **预期结果为空**：表示没有启用的触发器，预检查不会报告第二类警告。
 - **返回记录**：表示存在启用的触发器，在切换后需要手动禁用这些触发器。

## 问题的风险及影响

无。

## 适用版本

- OMS 4.3.0
 - OceanBase 数据库企业版/社区版 4.2.x
 - Oracle 11g 及兼容版本
 - 双向同步链路（结构 + 全量 + 增量 + 切换 + 反向）

## 解决方法

### 详细操作步骤

#### 问题一：无主键且包含 LOB 字段的表

**方法一：添加主键（推荐）**

为表添加主键约束，确保主键列非空，并尽量选择业务上稳定的列。

```sql
ALTER TABLE your_schema.your_table ADD CONSTRAINT pk_your_table PRIMARY KEY (column1, column2);

```

**方法二：改造 LOB 字段**

如果业务上不需要存储大对象数据，可以考虑将 BLOB/CLOB 字段改为 VARCHAR2 等普通数据类型，以降低同步风险。

**方法三：确保联合唯一键所有列为非空**

如果表已存在联合唯一键，可以修改表结构，确保该唯一键的所有列均为 NOT NULL。修改后，OMS 可识别该 UK 为有效的唯一索引。

```sql
ALTER TABLE your_schema.your_table MODIFY (column1 NOT NULL, column2 NOT NULL);

```

#### 问题二：触发器

**步骤 1：忽略预检查中的触发器警告**

该警告不影响链路的创建，可以在预检查阶段直接跳过。

**步骤 2：在正向切换阶段迁移触发器**

OMS 会在正向切换时自动将 Oracle 源端的触发器迁移到 OceanBase 目标端。切换完成后，业务将在 OceanBase 上运行。

**步骤 3：禁用 Oracle 源端的触发器**

切换完成后，在 Oracle 源端执行以下命令禁用相关触发器。

- 禁用单个触发器：

  ```sql
  ALTER TRIGGER your_schema.trigger_name DISABLE;

  ```
 - 批量生成禁用语句：

  ```sql
  SELECT 'ALTER TRIGGER ' || owner || '.' || trigger_name || ' DISABLE;'
  FROM dba_triggers
  WHERE owner = 'YOUR_SCHEMA' AND status = 'ENABLED';

  ```

**步骤 4：验证反向增量同步**

确认 Oracle 源端所有相关触发器均已禁用后，观察反向增量同步是否正常运行，并验证两端数据的一致性。

### 操作风险评估

- **风险等级**：中低风险。
 - **说明**：
     - 触发器问题按照上述流程处理即可。
     - 无主键且包含 LOB 字段的表需要在迁移前完成表结构改造，否则在反向增量阶段存在数据质量风险。

### 预计恢复时间

- 添加主键或改造 LOB 字段：取决于表的大小和锁表时间，通常为分钟级别。
 - 禁用 Oracle 触发器：秒级别。
 - 重建反向增量同步一致性：如果已经产生了数据不一致，可能需要重新进行全量数据校验或修复，耗时较长。

### 回滚方案

如果反向增量同步已出现数据不一致，可采取以下步骤：

1. 暂停反向增量同步链路。
 2. 对受影响的数据表重新进行全量数据校验或全量同步。
 3. 修复 Oracle 端的数据后，再恢复反向增量同步。

## 规避方式

无。

上一篇

[merge into 临时表时在计划执行阶段触发报错-4016 问题排查](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000006783643)

下一篇

[OR 展开改写](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000006837772) ![有帮助](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) 咨询热线
