ora-01400报错源于v$log_history中thread#=0的脏数据导致resync catalog时向rlh表插入null的low_time;需先查询确认并用dbms_backup_restore.resetloghistory(0)清除或重建控制文件。
ora-01400 或 rman-00600 [8201] 报错,本质是 controlfile 和 catalog 元数据不一致,resync catalog 不是万能命令,盲目执行可能失败甚至加重问题。
为什么 resync catalog 会报 ORA-01400?
错误 ORA-01400: cannot insert NULL into ("RMAN_YANGDB"."RLH"."LOW_TIME") 表明 catalog 表 RLH(即 RC_LOG_HISTORY)收到一条 LOW_TIME 为 NULL 的记录。根源在目标库的 v$log_history 中存在 thread#=0 的脏数据——这本不该存在,但某些异常归档、控制文件重建或 Data Guard 切换后残留会导致该现象。
执行 resync catalog 时,RMAN 会拉取 v$log_history 全量快照并尝试写入 catalog;遇到 thread#=0 条目,其 FIRST_TIME 可能为空或非法,最终触发 NOT NULL 约束失败。
- 先确认是否存在问题记录:
SELECT thread#, sequence#, first_time FROM v$log_history WHERE thread# = 0; - 若返回结果非空,说明 controlfile 已污染,
resync必然失败 - 该问题与 catalog 数据库版本无关,11g/12c/19c 均可能触发
Resync 失败后不能只 retry,要先清理 controlfile 脏数据
Oracle 不允许直接删 v$log_history(它是只读视图),但可通过底层 X$ 表定位并清空对应记录。操作前必须停业务、做控制文件备份,并确保有可回退手段。
- 查出
thread#=0对应的RECID和STAMP:SELECT recid, stamp FROM x$kccih WHERE thr=0; - 用
DBMS_BACKUP_RESTORE包清除(需 SYS 权限):EXEC DBMS_BACKUP_RESTORE.RESETLOGHISTORY(0); - 或更稳妥方式:重建 controlfile(仅当无其他办法时)——从当前 controlfile trace 出 SQL,修改为
RESETLOGS模式重建 - 完成后重启数据库,再验证
v$log_history WHERE thread#=0是否为空
RMAN-00600 [8201] 的同步逻辑陷阱
这个内部错误明确指向 controlfile 与 catalog 的 SCN、DBID、日志序列等关键字段不匹配。resync catalog 本身依赖 snapshot controlfile 做比对,但如果 snapshot 生成时 controlfile 已损坏(如被异常中断的 backup 更新过半),比对结果就不可信。
- 不要在 target 库繁忙时执行
resync,避免 snapshot 捕获到中间态 - 检查
v$database的DBID和NAME是否与 catalog 中RC_DATABASE表一致,不一致需先UNREGISTER再REGISTER - 如果刚做完 SWITCHOVER / FAILOVER,必须在新主库上先
RESYNC CATALOG FROM DB_UNIQUE_NAME <old_primary></old_primary>,否则 catalog 仍指向旧角色 -
RESET DATABASE命令慎用——它会重置 catalog 中所有备份记录的 DBINC,仅适用于 DBID 变更且确认旧备份全部失效的场景
Data Guard 环境下 resync 的特殊约束
DG 库执行 resync catalog 会自动触发“从主库全量同步”,但前提是主库已注册且状态正常。报错 ORA-20079: full resync from primary database is not done 并非网络不通,而是 catalog 缺少主库的 DB_UNIQUE_NAME 映射或主库未完成首次 RESYNC。
- 必须在主库上先执行一次
RESYNC CATALOG,让 catalog 记录主库的完整控制文件快照 - 备库连接 catalog 后,需显式指定源:
RESYNC CATALOG FROM DB_UNIQUE_NAME <primary_db_unique_name></primary_db_unique_name> - tnsnames.ora 中必须定义与
DB_UNIQUE_NAME同名的连接串,否则 RMAN 找不到主库实例 - 切勿在备库用
target /(操作系统认证)连 catalog,应统一用密码认证并明确指定@catdb
真正麻烦的从来不是命令敲不对,而是你执行 resync catalog 时,controlfile 里已经混进了不该存在的 thread#=0,或者 catalog 里存着一个早已被 RESETLOGS 覆盖掉的旧 DBINC —— 这些状态不会报错,但会让后续所有恢复操作静默失败。











