基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
无主键 BLOB 表反向增量数据一致性问题
更新时间:2026-08-25 02:41
问题现象
客户在进行 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 认可用于行定位,必须满足两个条件:
- 是唯一索引(UK 满足此条件)。
- 所有列都是 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 查询:
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 查询:
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 查询:
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 字段的表
方法一:添加主键(推荐)
为表添加主键约束,确保主键列非空,并尽量选择业务上稳定的列。
ALTER TABLE your_schema.your_table ADD CONSTRAINT pk_your_table PRIMARY KEY (column1, column2);
方法二:改造 LOB 字段
如果业务上不需要存储大对象数据,可以考虑将 BLOB/CLOB 字段改为 VARCHAR2 等普通数据类型,以降低同步风险。
方法三:确保联合唯一键所有列为非空
如果表已存在联合唯一键,可以修改表结构,确保该唯一键的所有列均为 NOT NULL。修改后,OMS 可识别该 UK 为有效的唯一索引。
ALTER TABLE your_schema.your_table MODIFY (column1 NOT NULL, column2 NOT NULL);
问题二:触发器
步骤 1:忽略预检查中的触发器警告
该警告不影响链路的创建,可以在预检查阶段直接跳过。
步骤 2:在正向切换阶段迁移触发器
OMS 会在正向切换时自动将 Oracle 源端的触发器迁移到 OceanBase 目标端。切换完成后,业务将在 OceanBase 上运行。
步骤 3:禁用 Oracle 源端的触发器
切换完成后,在 Oracle 源端执行以下命令禁用相关触发器。
禁用单个触发器:
ALTER TRIGGER your_schema.trigger_name DISABLE;批量生成禁用语句:
SELECT 'ALTER TRIGGER ' || owner || '.' || trigger_name || ' DISABLE;' FROM dba_triggers WHERE owner = 'YOUR_SCHEMA' AND status = 'ENABLED';
步骤 4:验证反向增量同步
确认 Oracle 源端所有相关触发器均已禁用后,观察反向增量同步是否正常运行,并验证两端数据的一致性。
操作风险评估
- 风险等级:中低风险。
- 说明:
- 触发器问题按照上述流程处理即可。
- 无主键且包含 LOB 字段的表需要在迁移前完成表结构改造,否则在反向增量阶段存在数据质量风险。
预计恢复时间
- 添加主键或改造 LOB 字段:取决于表的大小和锁表时间,通常为分钟级别。
- 禁用 Oracle 触发器:秒级别。
- 重建反向增量同步一致性:如果已经产生了数据不一致,可能需要重新进行全量数据校验或修复,耗时较长。
回滚方案
如果反向增量同步已出现数据不一致,可采取以下步骤:
- 暂停反向增量同步链路。
- 对受影响的数据表重新进行全量数据校验或全量同步。
- 修复 Oracle 端的数据后,再恢复反向增量同步。
规避方式
无。