ocr和olr全部丢失且无有效备份时无法无损恢复,只能重建集群结构并手动补全资源;业务数据文件若完好则可保留,但集群管理上下文已断裂,需通过rootcrs.pl清理后逐项注册asm、数据库、实例及服务,并重置serverpool策略。

OCR 和 OLR 全部丢失,且无有效备份时,无法真正“无损”恢复集群——因为 OCR 存储的是集群资源配置、数据库注册信息、ASM 磁盘组状态等运行时元数据,一旦全丢又无备份,这些信息不可逆丢失。所谓“恢复”,实际是重建集群结构并手动补全关键资源,业务数据库文件若未损坏,数据本身可保,但集群管理上下文已断裂。
ocr.loc 和 olr.loc 都没了,先确认是否真没备份
-
OCR默认每 4 小时自动备份一次,位置在+GRID_OCR/backup00.ocr(ASM 磁盘组内)或$GRID_HOME/cdata/<cluster_name>/</cluster_name>(文件系统) -
OLR(Oracle Local Registry)备份通常在$GRID_HOME/cdata/<node>name>/</node>下,文件名类似backup<timestamp>.olr</timestamp> - 检查前务必确认 ASM 磁盘组是否 still online:
asmcmd lsdg
若STATE=DISMOUNTED或磁盘组无法识别,说明底层存储或权限异常,此时连备份都读不到,得先解决 ASM 层问题
常见误判点:
- 以为
ocrcheck报错就等于 OCR 没了,其实可能是ocr.loc文件路径写错,或权限不对(应属root:oinstall,640) - 直接删了
/etc/oracle/ocr.loc就认为“丢失”,但该文件只是指针,真正内容在 ASM 或文件系统里
用 rootcrs.pl -deconfig -force 清理残留再重建,但必须满足前提
这个操作会清除所有节点的 CRS 注册信息,不可逆。仅在以下条件全部满足时才可执行:
- 所有节点的
GRID_HOME完整,ORACLE_HOME未损坏 - ASM 磁盘组物理可用(
asmcmd lsdsk能列出磁盘,且状态不是PROVISIONED或FOREIGN) - 网络配置(
/etc/hosts、VIP、SCAN)仍正确,且两节点间心跳网络可达 - 数据库实例的数据文件、控制文件、在线日志均未损坏(它们不依赖 OCR 存活)
执行流程要点:
- 所有节点先停 CRS:
crsctl stop crs -f
- 在一个节点上以
root运行:perl $GRID_HOME/crs/install/rootcrs.pl -verbose -deconfig -force
-
关键陷阱:若执行卡在
Adding daemon to inittab,说明ohasd服务没起来,需手动启动:systemctl start oracle-ohasd
(RHEL7+)或检查/etc/init.d/ohasd是否存在且可执行 - 重建后必须立刻用
ocrconfig -repair或ocrconfig -import导入已知的 OCR 备份;若真无备份,只能靠srvctl add逐个注册资源
数据库实例能 mount,但 srvctl status database 显示 OFFLINE,怎么办
这是典型 OCR 重建后资源未注册的表现,不是数据库坏了,而是集群“不认识它了”。
必须手动补全注册信息,顺序不能错:
- 先加磁盘组(如果 ASM 实例已起):
srvctl add asm -i +ASM1 -n node1 -o $GRID_HOME
- 再加数据库(注意
-d后是db_name,不是ORACLE_SID):srvctl add database -d webwkdb -o $ORACLE_HOME -p +DATA/webwkdb/spfilewebwkdb.ora
- 加实例(每个节点一个):
srvctl add instance -d webwkdb -i webwkdb1 -n node1
- 最后加服务(如有):
srvctl add service -d webwkdb -s app_svc -r webwkdb1,webwkdb2
漏掉 srvctl add asm 会导致后续 srvctl add database 报 CRS-2566 错误;用错 -d 名称会导致 srvctl config database 查不到配置。
重建后 crsctl check cluster 显示 OK,但数据库无法 auto-start
根本原因:OCR 重建后,原 serverpool 配置丢失,而 RAC 11g+ 默认启用 server pooling 管理资源启停策略。
必须显式重置:
- 查看当前 pool:
crsctl status serverpool
- 删除默认池(会清空其关联的所有数据库):
crsctl delete serverpool ora.<code>pool_name</code>
- 重建并绑定数据库:
crsctl add serverpool ora.db_pool -min 2 -max 2 -servers "node1 node2"
srvctl modify database -d webwkdb -g ora.db_pool
这一步极易被跳过,结果就是 crsctl start cluster 后数据库始终处于 INTERMEDIATE 状态,srvctl start database 也报 CRS-2672。
真正的难点不在命令本身,而在于重建后你无法知道原来哪些参数被隐式设置过——比如 start_options 是 open 还是 mount,diskgroup 依赖关系是否含 RECO 组。这些都得靠源环境记录、归档日志时间点、或从 v$database 的 created 时间反推。











