不能。DBMS_REDEFINITION是在线重定义表结构的工具,不具备行级或校验和级别的数据一致性检查能力,无法用于主备数据核对。
DBMS_REDEFINITION 能不能用来核对主备数据不一致?
不能。这是最常见的误解——dbms_redefinition 是在线重定义表结构的工具,不是数据比对工具。它不提供任何行级或校验和级别的数据一致性检查能力。强行用它“核对”,只会浪费时间,还可能因中间表残留引发锁或空间问题。
主备数据不一致时,DBMS_REDEFINITION 的典型误用场景
有人尝试在备库上对某张表执行 DBMS_REDEFINITION.START_REDEF_TABLE,以为能触发数据同步或暴露差异。实际效果是:
- 备库是只读的(
OPEN_MODE=READ ONLY),调用会直接报错ORA-16000: database open for read-only access - 即使在主库上执行,也只是为单表建影子结构,跟备库当前状态完全无关
- 若误在主库完成重定义后又未同步 DDL 到备库,反而扩大不一致范围
真正能用于主备数据核对的替代方案
Oracle 官方推荐路径是结合物理复制机制本身做验证,而非依赖逻辑层工具:
- 确认
ARCHIVE_LAG_TARGET和LOG_ARCHIVE_DEST_n配置中VALID_FOR、SYNC/NOSYNC设置是否符合预期 - 查
V$DATAGUARD_STATS中apply lag和transport lag是否持续为 0(单位:秒) - 比对主备库的
SCN:SELECT CURRENT_SCN FROM V$DATABASE,再用SELECT SCN_TO_TIMESTAMP(<scn>) FROM DUAL</scn>看时间偏移 - 对关键表做抽样校验:主备分别执行
SELECT COUNT(*), DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(LISTAGG(...)),2) FROM ...(注意字段顺序、NULL 处理、字符集一致性)
为什么不用 DBMS_REDEFINITION 做核对,但有时会看到它出现在 DG 故障处理中?
极少数情况下,它被用于修复「因 DDL 不兼容导致的逻辑不一致」,比如主库加了唯一约束但备库没同步成功,导致后续 DML 报错。此时流程是:
- 停应用,确认主备都无新事务写入
- 在主库用
DBMS_REDEFINITION重建问题表(带约束/索引) - 手动补全备库缺失的 DDL(如
ALTER TABLE ... ADD CONSTRAINT) - 切回应用前,必须重新验证
V$STANDBY_LOG和V$ARCHIVED_LOG的连续性
这个过程本质是「修复元数据」,不是「核对数据」。一旦跳过 SCN 对齐和日志连续性检查直接操作,风险极高。










