在Oracle 11g RAC环境中,当一台节点因网络故障完全不可用且无法快速恢复时,为了保障业务连续性,可以将其从集群中隔离,并让剩余的健康节点以单实例模式继续运行。以下是详细的操作步骤和注意事项:
核心思路:
隔离故障节点:确保集群不再尝试与故障节点通信。
修改集群配置:强制剩余节点以单实例模式运行。
重建资源:确保VIP、监听器等资源在健康节点生效。
详细步骤:
1.确认故障节点状态
            
            
              sql
              
              
            
          
          crsctl status node -n  # 查看所有节点状态
crsctl status res -t   # 查看所有资源状态(关注故障节点资源是否OFFLINE)
        如果故障节点状态为 UNKNOWN 或资源持续 FAILED,说明集群已检测到异常。
2.驱逐故障节点(强制移除)
            
            
              bash
              
              
            
          
          # 在健康的节点上执行:
crsctl delete node -n <故障节点主机名> -f  # 强制从集群配置中删除故障节点
        注意:此操作不可逆,需确保故障节点已无法恢复。
3.修改集群参数(关键步骤)
            
            
              sql
              
              
            
          
          -- 在健康的节点上修改参数:
alter system set cluster_database=FALSE scope=spfile sid='<健康节点实例名>';
示例:
alter system set cluster_database=FALSE scope=spfile sid='RACDB1';
        4.停止集群服务(仅限健康节点)
            
            
              sql
              
              
            
          
          crsctl stop crs -f  # 强制停止本节点集群服务
        5.清理故障节点残留资源
            
            
              sql
              
              
            
          
          # 在健康节点上清理故障节点的资源注册:
crsctl delete res ora.<故障节点VIP名>.vip -f
crsctl delete res ora.<故障节点监听名>.lsnr -f
        6.重启健康节点数据库(单实例模式)
            
            
              sql
              
              
            
          
          sqlplus / as sysdba
> shutdown immediate;     # 确保实例关闭
> startup;                # 此时将以单实例模式启动
验证参数:
show parameter cluster_database; -- 应返回 FALSE
        7.重新配置监听与VIP
            
            
              sql
              
              
            
          
          # 手动启动本节点监听(VIP通常由CRS自动管理):
srvctl start listener -n <健康节点主机名>
srvctl start vip -n <健康节点主机名> -v  # 确保VIP生效
        8.修改应用连接字符串
将应用的TNS连接字符串指向健康节点的 VIP或主机名,移除故障节点地址:
            
            
              sql
              
              
            
          
          tnsnames.ora
RACDB_SINGLE =
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = <健康节点VIP>)(PORT = 1521))
    (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = RACDB))
  )
        关键注意事项:
数据一致性
确保故障节点在宕机前未持有未提交事务(通常RAC会自动处理)。
检查 gv$transaction 是否有残留事务(需在故障前查看,现已不可用)。
资源清理
使用 crsctl stat res -t -v 检查所有资源是否仅绑定到健康节点。
若故障节点资源残留,用 crsctl delete res 强制删除。
备份与恢复
立即备份:单节点运行后,立即进行全库备份。
重建故障节点:故障修复后,需重新添加节点到集群(需重装Grid Infrastructure并执行 addNode.sh)。
性能风险
单节点可能面临更高负载,监控 AWR报告 和 等待事件。
回退集群模式(恢复后)
            
            
              sql
              
              
            
          
          alter system set cluster_database=TRUE scope=spfile sid='*';  # 恢复集群模式
srvctl stop database -d RACDB
srvctl start database -d RACDB   # 正常启动所有节点
        自动化工具辅助:
使用 srvctl 命令管理资源:
            
            
              sql
              
              
            
          
          srvctl config database -d RACDB  # 检查数据库配置
srvctl status vip -n <节点名>     # 检查VIP状态
        通过OEM(Oracle Enterprise Manager)实时监控切换状态。
总结流程图:
            
            
              sql
              
              
            
          
          graph TD
    A[故障节点网络中断] --> B{是否可快速恢复?}
    B -->|否| C[强制驱逐故障节点]
    C --> D[修改cluster_database=FALSE]
    D --> E[停止集群服务]
    E --> F[清理故障节点资源]
    F --> G[单实例模式启动数据库]
    G --> H[重配监听/VIP]
    H --> I[修改应用连接]
    I --> J[监控单节点性能]
        通过以上步骤,业务将在健康节点以单实例模式继续运行。故障节点修复后,需重新加入集群并恢复高可用模式。务必在变更前备份OCR和数据库!