EXPDP导出RMAN Recovery Catalog需显式指定schemas=RMAN并排除STATISTICS,且必须用SYSTEM等高权限用户执行;不可按表或条件筛选,须整库导出以保证外键一致性;导入前须确保目标库catalog版本≥源库版本。
EXPDP 导出 RMAN Recovery Catalog 失败:ORA-31655 / ORA-39127
直接用 expdp 导出 recovery catalog 所在的目录数据库(通常是普通 oracle 数据库,但 schema 是 rman)时,常报 ora-31655: no data or metadata objects selected 或 ora-39127: unexpected error from call to local str function。这不是权限或连接问题,而是因为 expdp 默认跳过 rman 管理的元数据表(如 rc_database, rc_backup_set),它们被标记为“只读元数据对象”,不参与常规 data pump 导出。
解决办法是显式指定要导出的 schema 和表,并绕过元数据保护机制:
- 必须用
SYSTEM或具有EXP_FULL_DATABASE角色的用户执行,RMAN用户本身权限不足 - 加上参数
exclude=STATISTICS,避免统计信息引发兼容性错误 - 明确指定
schemas=RMAN,不能依赖full=y—— 它会跳过 RMAN schema - 若目标库版本低于源库(比如从 19c 导到 12c),需加
version=12.2(或对应目标版本),否则可能因视图定义差异失败
典型命令:
expdp system/password@catalog_db schemas=RMAN exclude=STATISTICS version=19.0 dumpfile=rman_cat.dmp logfile=rman_cat.log
RMAN catalog 表结构特殊:不能只导部分表
RMAN Recovery Catalog 的表之间有强外键和逻辑依赖,比如 RC_DATABASE → RC_TABLESPACE → RC_DATAFILE,手动挑几个表导出会破坏一致性。哪怕只是想备份最近 30 天的备份记录,也不能用 query="WHERE completion_time > SYSDATE-30" 过滤 RC_BACKUP_SET —— 因为关联的 RC_BACKUP_PIECE、RC_ARCHIVE_LOG 等不会自动连带导出,恢复时会报 ORA-20001: invalid backup piece。
- 必须整库导出
RMANschema,不能按表或按条件筛选 - 如果磁盘空间紧张,可先用
expdp ... compression=all压缩导出文件(12c+ 支持) - 不要试图用
sqlplus+spool导出建表语句再重建——RMAN catalog 含大量内部触发器、物化视图日志,手工还原不可靠
导入时容易忽略的 catalog 版本兼容性
用 impdp 导入 RMAN catalog 到另一个库时,最常踩的坑是版本错配。Oracle 要求:目标库的 catrman.sql 版本号 ≥ 导出时源库的 catalog 版本。例如,从 19.14 的 catalog 导出,目标库如果是 19.3,则即使同属 19c,也会在导入中途报 ORA-06512: at "SYS.DBMS_RCVCAT", line 12345 并中止。
- 导入前务必检查目标库是否已运行过对应版本的
@?/rdbms/admin/catrm.sql(或catrman.sql) - 用
SELECT * FROM rman.rcver;查看当前 catalog 版本;导出日志里也有 “Catalog version” 字样,二者必须匹配或目标更高 - 跨大版本(如 12c → 19c)必须先升级目标库 catalog:
EXECUTE dbms_rcvcat.upgrade_catalog;,且需在SQL*Plus中以RMAN用户执行,不是sys
备份 catalog 不等于保障备份安全
导出 RMAN schema 只是把元数据存成一个 .dmp 文件,它本身不校验内容完整性,也不绑定实际备份片(backup piece)。如果磁盘损坏导致 .dmp 文件损坏,或者导入后没验证 catalog 是否能正常查询历史备份,那这个“备份”就形同虚设。
- 每次
expdp后立刻用impdp ... sqlfile=check.sql生成 DDL 预览,确认没报错 - 导入新环境后,至少执行一条真实查询:
SELECT COUNT(*) FROM rc_backup_set WHERE rownum = 1;,验证基础视图可访问 - 真正的安全策略是:定期导出 + 把
.dmp文件同步到异地存储 + 每季度做一次完整 restore 测试
元数据备份再全,也救不回被误删的备份片。它只帮你记住“曾经有哪些备份”,而不是“备份还在不在”。










