srvctl config database 仅输出数据库级静态信息,不包含ASM、监听器等依赖资源;完整备份需结合ocrconfig手动备份、srvctl export导出XML及crsctl采集元数据。
srvctl config database 不能导出完整资源依赖关系
很多人以为 srvctl config database -d <db_name></db_name> 能直接拿到可复用的配置快照,其实它只输出数据库级静态信息(比如实例名、oracle home、spfile 路径),完全不包含 ora.asm、ora.listener、磁盘组依赖、网络策略这些关键资源定义。一旦集群重建或节点重装,仅靠这个命令的结果根本没法还原。
真正能导出全量资源配置的是 crsctl stat res -p 和 crsctl query css votedisk 这类底层命令,但它们输出的是 raw resource profile,不是 srvctl 可直接导入的格式。
-
srvctl config类命令适合日常巡检,不适合备份恢复场景 - 要导出“可再导入”的配置,必须用
srvctl export,且仅支持 database、service、listener 三类资源 -
srvctl export -d <db_name> -o /tmp/db_export.xml</db_name>输出的是 CRS XML 格式,含部分依赖声明,但不含 OCR 中的私有属性(如USR_ORA_ENV的完整内容)
srvctl import database 会覆盖现有资源定义
srvctl import database 不是“合并”操作,而是先删除同名资源再重建。如果你在已有正常运行的 RAC 上执行 srvctl import -d <db_name> -i /tmp/db_export.xml</db_name>,所有关联实例、服务、监听器都会被停掉并按 XML 重新注册——哪怕 XML 里漏写了某个实例,那个实例就彻底从 CRS 中消失了。
- 导入前务必确认目标集群节点数、Oracle Home 路径、ASM 磁盘组名与导出时一致,否则
srvctl start database会报CRS-2674: Start of 'ora.<db>.db' failed</db> - XML 中的
ORACLE_HOME和SPFILE路径是绝对路径,跨环境导入前必须手动替换,sed -i 's#/u01/app/oracle/product/19c/db#/u01/app/oracle/product/21c/db#g' /tmp/db_export.xml - 如果原库用了 Flex ASM,导入 XML 前得先确保
ora.asm资源已在线且版本兼容,否则ora.<db>.db</db>启动时卡在ORA-15032: not all alterations performed
OCR 备份比 srvctl export 更可靠,但恢复粒度更粗
很多人花时间折腾 srvctl export/import,却忽略 Oracle 官方推荐的 OCR 级备份方式:ocrconfig -showbackup 查看自动备份,ocrconfig -restore /path/to/backup.ocr 全量恢复。它保存的是整个 CRS 配置树,包括用户自定义资源、权限设置、网络策略,srvctl 导出的 XML 根本不包含这些。
- OCR 备份每 4 小时一次(默认),保留 3 个本地 + 2 个远程副本,比人工导出 XML 更及时、更完整
- 但 OCR 恢复是全集群停机操作,需所有节点 CRS 停止,
crsctl stop crs -f,不适合只想还原单个数据库的场景 - 若只需恢复某几个资源,可用
crsctl replaceconfig -f加上从 OCR 备份中提取的特定 resource profile,但要求 profile 必须带完整ID和VERSION字段,否则导入失败报CRS-4000: Command ReplaceConfig failed
真实备份脚本必须包含 OCR + srvctl export + 关键元数据快照
单一手段都不可靠:OCR 备份太重,srvctl export 太轻,中间缺了 OCR 中的资源状态和用户自定义属性。一个生产可用的备份脚本,至少要打包三样东西,并验证可读性。
- 运行
ocrconfig -showbackup确认最新自动备份时间,再手动触发一次ocrconfig -manualbackup - 执行
srvctl export -d <db_name> -o /backup/<db_name>_$(date +%Y%m%d).xml</db_name></db_name>,同时导出 service:srvctl export service -d <db_name> -s <svc_name> -o /backup/<svc_name>.xml</svc_name></svc_name></db_name> - 补充采集元数据:
crsctl stat res -p | grep -E "^(NAME|TYPE|ACL|USR_ORA_ENV)" > /backup/crs_resources_profile.txt,这个文件能帮你快速定位哪些环境变量没进 XML - 最后用
zip -r /backup/rac_config_$(date +%Y%m%d_%H%M).zip /backup/*.xml /backup/*.txt /backup/*.ocr打包,别忘了校验 zip 是否可解压
最常被跳过的一步是验证 XML 是否真能导入:在测试集群跑一遍 srvctl add database -d testdb ... 再 srvctl import -d testdb -i /backup/xxx.xml,否则上线那天才发现 SPFILE 路径写错,就只能切 OCR 恢复了。










