1. 问题现象与背景分析
上周在客户现场遇到一个典型的Flex ASM环境故障:Oracle Grid Infrastructure(GI)集群无法正常启动,检查发现crsd进程未能成功拉起。这种故障在11g/12c的Flex ASM架构中并不罕见,但排查过程往往让DBA们头疼。具体表现为:
CRS-4639: Could not contact Oracle High Availability Services CRS-4000: Command Start failed, or completed with errorsFlex ASM是Oracle 12c引入的新架构,与传统ASM相比最大的区别在于解耦了ASM实例与数据库节点的绑定关系。这种架构下,ASM实例可以运行在集群中的任意节点上,而crsd作为集群资源服务守护进程,其启动失败会直接导致整个GI堆栈无法正常工作。
2. 故障排查步骤实录
2.1 初始诊断三板斧
首先执行标准检查流程:
# 检查集群状态 crsctl check cluster -all # 查看crsd日志 tail -500f $GRID_HOME/log/`hostname`/crsd/crsd.log # 检查OHASD状态 crsctl check has日志中关键报错如下:
[ohasd(27795)]CRS-2765:Resource 'ora.crsd' has failed on server 'node1'. [cssd(12351)]CRS-1713:CSSD daemon is started in exclusive mode2.2 深度分析工具使用
使用Oracle提供的专用诊断工具进一步定位:
# 收集集群诊断信息 crsctl diagcollect -collect crs # 检查SCAN配置 srvctl config scan srvctl config scan_listener # 验证网络配置 oifcfg getif发现一个关键线索:Flex ASM的监听器资源未能正确注册到集群中。这解释了为什么crsd在尝试管理ASM资源时卡死。
3. 根本原因定位
3.1 Flex ASM架构特性分析
与传统ASM不同,Flex ASM架构中:
- ASM实例数量可以少于数据库节点数(通常3个足够)
- 客户端连接通过SCAN监听器负载均衡
- ASM磁盘组需要配置CLIENT_COMPATIBILITY参数
本次故障的根本原因是:
- 节点扩容后未正确更新ASM_DISKSTRING参数
- 导致ASM实例无法识别新增的磁盘路径
- 进而造成监听器注册失败
- 最终触发crsd启动超时
3.2 配置错误验证
通过以下命令确认配置问题:
-- 检查ASM参数 SQL> show parameter asm_diskstring -- 查看磁盘组兼容性 SQL> select name, compatibility, database_compatibility from v$asm_diskgroup;结果显示asm_diskstring仍指向旧的磁盘路径,而新增的NVMe磁盘未被包含。
4. 解决方案实施
4.1 分步修复流程
- 首先停止所有相关资源:
crsctl stop res ora.asm -f crsctl stop has -f- 修正ASM磁盘路径:
ALTER SYSTEM SET asm_diskstring='/dev/oracleasm/disks/*','/dev/nvme*' SCOPE=SPFILE;- 更新磁盘组兼容性(仅限Flex ASM):
ALTER DISKGROUP DATA SET ATTRIBUTE 'client_compatibility'='12.2';- 重新初始化集群栈:
crsctl start has crsctl start crs4.2 关键参数验证
修复后必须检查:
# 确认所有节点ASM实例正常 srvctl status asm -detail # 验证监听器注册 lsnrctl status LISTENER_SCAN1 # 检查资源状态 crsctl stat res -t5. 预防措施与最佳实践
5.1 Flex ASM环境配置规范
- 磁盘路径配置建议:
-- 多路径环境下示例 ASM_DISKSTRING='/dev/mapper/*asm*','/dev/oracleasm/*'- 兼容性设置原则:
- 磁盘组COMPATIBILITY >= 12.2
- CLIENT_COMPATIBILITY >= 数据库版本
5.2 变更管理要点
在Flex ASM环境中进行以下操作时需特别注意:
- 存储扩容或路径变更
- 集群节点增减
- GI补丁应用
- 网络配置调整
建议操作流程:
- 预先检查asm_diskstring覆盖范围
- 临时禁用集群自动启动
- 执行变更后先单节点测试
- 最后全集群滚动实施
6. 深度问题排查技巧
6.1 日志分析要点
当遇到crsd启动问题时,应按顺序检查:
$GRID_HOME/log/<hostname>/agent/ohasd/oraagent_oracle/oraagent_oracle.log$GRID_HOME/log/<hostname>/agent/ohasd/orarootagent_root/orarootagent_root.log$GRID_HOME/log/<hostname>/crsd/crsd.log
重点关注时间戳衔接处,通常第一个报错才是真实原因。
6.2 常见错误代码速查
| 错误代码 | 可能原因 | 解决方案 |
|---|---|---|
| CRS-2765 | 资源依赖失败 | 检查前置资源(ASM/监听)状态 |
| CRS-4639 | 进程通信失败 | 验证网络/SCAN配置 |
| CRS-4000 | 通用启动失败 | 查看对应资源日志 |
| CRS-2674 | 启动超时 | 调整启动超时参数 |
7. 高级恢复手段
当标准流程无法解决时,可以尝试:
7.1 手动清理资源状态
crsctl delete res ora.asm -f crsctl delete res ora.LISTENER_SCAN1.lsnr -f7.2 重建OCR备份
crsctl replace ocr -force /path/to/backup7.3 使用root.sh修复
cd $GRID_HOME ./perl/bin/perl -I$GRID_HOME/perl/lib $GRID_HOME/crs/install/rootcrs.pl -deconfig -force ./root.sh重要提示:这些操作会导致服务中断,务必在维护窗口期进行,并提前备份OCR和VF