在RHEL 7+(或是类似的衍生Centos等)上安装oracle 11g 11.2.0.4,必然会遇见CRS-2101: The OLR was formatted using version 3.或者ohasd进程无法启动,进而导致整个集群安装失败。
原因是在在RHEL 7之前的版本中,系统使用传统的init进程来管理服务启动。Oracle 11g RAC的root.sh脚本会创建并启动ohasd(Oracle High Availability Services Daemon)进程,该进程负责启动整个集群。然而,RHEL 7及更高版本使用systemd作为初始化系统。systemd与传统的init系统在服务管理上有很大不同。当运行root.sh脚本时,它会尝试通过init脚本来启动ohasd,但systemd无法正确管理这种传统服务,导致启动失败。
按照手册操作的时候,当在RAC一个节点上新建了服务后,不要在另外一个节点上再新建,需要拷贝到另外一个节点。
一、问题背景
- systemd使用.service单元文件管理服务,而ohasd依赖传统的/etc/init.d脚本
- root.sh脚本尝试通过init方式启动ohasd,但systemd无法正确处理这种启动方式
- systemd对守护进程有更严格的监控要求
- ohasd启动后可能被systemd错误识别为"failed"状态
- systemd并行启动机制可能导致依赖ohasd的服务过早启动
CRS-2101: The OLR was formatted using version 3
Failed to start Oracle High Availability Services
二、根本原因
- ohasd.bin无法被systemd正确识别为守护进程
- 缺少systemd所需的.service单元文件
- 传统init脚本在systemd环境下执行异常
三、实操步骤
1. 创建systemd服务单元文件
--创建服务文件
sudo tee /usr/lib/systemd/system/ohasd.service > /dev/null <<'EOF'
[Unit]
Description=Oracle High Availability Services
After=syslog.target network.target
[Service]
Type=forking
Environment=ORACLE_HOME=/u01/app/11.2.0/grid
ExecStart=$ORACLE_HOME/bin/ohasd.bin start
ExecStop=$ORACLE_HOME/bin/ohasd.bin stop
Restart=always
RestartSec=30
User=grid
Group=oinstall
[Install]
WantedBy=multi-user.target
EOF
2. 设置文件权限并重载systemd
--设置适当权限
sudo chmod 644 /usr/lib/systemd/system/ohasd.service
--重载systemd配置
sudo systemctl daemon-reload
3. 启用并启动服务
--启用开机自启
sudo systemctl enable ohasd
# 启动服务
sudo systemctl start ohasd
4. 验证服务状态
--检查服务状态
sudo systemctl status ohasd
# 输出包含:
# Active: active (running) since [timestamp]
# Main PID: [pid] (ohasd.bin)
5. 执行root.sh安装脚本
--进入Grid Infrastructure目录
cd /u01/app/11.2.0/grid
# 以root身份执行安装脚本
sudo ./root.sh
四、关键操作注意事项
1. 安装过程中的特殊处理
当运行root.sh时,需监控init.ohasd文件的生成:
--在单独终端中监控文件生成
while [ ! -f /etc/init.d/init.ohasd ]; do
sleep 2
done
# 文件生成后立即启动服务
sudo systemctl start ohasd
2. 多节点集群处理(除了第一个节点新建以外,其他都是拷贝)
- 在主节点完成上述配置
- 将服务文件copy到其他节点,:
scp /usr/lib/systemd/system/ohasd.service root@node2:/usr/lib/systemd/system/
在其他节点执行以上步骤
五、验证与诊断脚本
1. 服务状态验证脚本
bash#!/bin/bash
# ohasd_service_check.sh
# 检查服务状态
systemctl status ohasd > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "ohasd.service status: ACTIVE"
else
echo "ohasd.service status: INACTIVE"
exit 1
fi
# 检查进程运行状态
if pgrep -f "ohasd.bin" > /dev/null; then
echo "ohasd.bin process: RUNNING"
else
echo "ohasd.bin process: NOT FOUND"
exit 1
fi
# 检查集群状态
ORACLE_HOME=/u01/app/11.2.0/grid
$ORACLE_HOME/bin/crsctl check has
exit 0
2. 错误诊断命令
--查看服务详细日志
journalctl -u ohasd -n 100 --no-pager
# 检查服务依赖关系
systemctl list-dependencies ohasd
# 检查环境变量配置
sudo -u grid env | grep ORA
# 验证SELinux状态(应禁用)
sestatus
六、故障排除指南
故障现象 |
可能原因 |
解决方案 |
ohasd.service启动失败 |
1. ORACLE_HOME路径错误 2. 权限不足 |
1. 检查服务文件中的ORACLE_HOME 2. 确认grid用户权限 3. 检查目录权限: sudo chown -R grid:oinstall $ORACLE_HOME |
root.sh执行卡住 |
ohasd未及时启动 |
1. 手动启动ohasd服务 2. 监控/etc/init.d/init.ohasd生成情况 |
节点间状态不一致 |
配置未同步 |
1. 确保所有节点配置相同 2. 重新同步配置文件 3. 重启集群服务 |
OLR版本错误 |
ohasd未正确初始化 |
1. 清理OLR配置: $GRID_HOME/bin/crsctl unpin css -n 2. 重新执行root.sh |
七、使用体验
--禁用SELinux
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 禁用防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
文件权限规范:
--设置标准权限
sudo chown -R grid:oinstall /u01/app/11.2.0/grid
sudo chmod -R 775 /u01/app/11.2.0/grid
sudo chmod 6750 /u01/app/11.2.0/grid/bin/oracle
定期维护脚本(可选,当地发现ohasd不存在的时候,也就不存在维护之说):
--ohasd维护脚本
sudo tee /usr/local/bin/ohasd_maintenance.sh > /dev/null <<'EOF'
#!/bin/bash
# 停止服务
systemctl stop ohasd
# 清理缓存
rm -f $ORACLE_HOME/crs/init/*
# 重启服务
systemctl start ohasd
EOF
sudo chmod +x /usr/local/bin/ohasd_maintenance.sh