重启Oracle 11g RAC后(on Linux7)ohasd.bin未启动

众所周知,oracle 11g(11.2.0.4) RAC 在Linux 7上安装并不是很顺利,之前我整理过几个小坑,其中最常见的就是ohasd.bin 或ohasd.server 未启动,影响root.sh时,或操作系统重启后,或安装补丁时。一般手动创建个服务,或是安装个patch引入服务也可以,但这次这个case有点复杂,断电重启后CRS无法启动,简单记录。

现象

CRS未启动,检查ohasd.bin也未启动,连/etc/init.d/init.ohasd也未启动,CRS log也没有任何输出。我们知道crs的启动顺序是init.ohasd衍生ohasd.bin,再启动一堆agent和crs\css等服务进程。

常见原因

  • ohasd service缺失
  • crs autorestart 禁用
  • ohasd.bin 进程损坏
  • olr损坏
  • 操作系统限制

分析

对于操作系统的问题 RHEL 7.3 kernel 3.10.0-514.21.1中有已知问题,升级OS内核因为KernelCare is turned on,安全问题阻止ohasd进程,这案例排除.

排查olr

发现确实是Olr不存在

原来是现场的人以为是olr问题备份了目录,把文件copy回来即可,该文件并没有坏。 重启问题依旧,只是不再提示olr文件问题.

检查service

在 Linux 4 和 Linux 5 中,内核启动完成后,会启动用户级程序 /sbin/init 来启动其他用户级进程或服务。/sbin/init 读取内容/etc/inittab 文件包含许多用于启动其他用户进程和服务的命令,在 Linux 5 中安装 RAC(10.2 或 11.2)后,脚本会在上一行添加启动 ohasd 守护进程的脚本。如果要在系统启动时启动 crs,需要在 /etc/inittab 文件中添加以下启动命令:

在 Linux 6 init 仅读取配置文件,处理各种服务和应用程序之间的依赖关系,基于事件启动这些函数和服务,并动态管理它们。在 Linux 6 中,事件由“Upstart 事件管理器”管理,在 Linux 6 中,使用 /etc/init 目录下的 oracle-ohasd.conf 配置文件来启动,而不是像 Linux 5 那样使用 /etc/inittab 进行配置。ohasd 启动时不会写入 /etc/inittab 文件,因此需要根据 /etc/init/ 目录中的事件管理配置文件来确定系统在启动时运行哪些服务:

在 Linux 7 中,系统采用 systemd 机制,使用 socket 和 D-Bus 并行启动服务,提供基于守护进程的按需启动策略。没有运行级别的概念(但完全兼容 sysvinit)。要启动的服务的配置文件存储在 /lib/systemd/system/ 目录中,文件名为 *.service,在 Linux 7 中,用于启动和加载 Oracle RAC 的 ohasd 单元必须按如下方式配置(安装过程中,运行 root.sh 将配置 ohasd 服务单元。如果未配置,您可以手动配置):

正常在systemctl中会有2个服务,ohasd.service和oracle-ohasd.service, RHEL 7中的oracle-ohasd.service
/etc/systemd/system/oracle-ohasd.service 也是调用 /etc/init.d/init.ohasd 。 而ohasd.service /etc/rc.d/init.d/ohasd 也是调用/etc/init.d/init.ohasd 。

在GI环境中,第一个启动的守护进程是OHAS。该进程依赖于 init 进程调用 /etc/init.d/init.ohasd,后启动 /etc/rc.d/init.d/ohasd,进而执行 $GRID_HOME/ohasd.bin。如果没有正常工作的 ohasd.bin 进程,其他所有进程都无法运行。管理员可以选择通过调用 crsctl disable crs 来禁用高可用性服务堆栈的启动。此调用会更新 /etc/oracle/scls_scr/hostname/root/ohasdstr 文件中的一个标志。该文件仅包含一个单词,即 enabledisable,且不包含回车符。如果设置为 disable,则/etc/rc.d/init.d/ohasd 将不会继续启动。在这种情况下,请调用 crsctl start crs 手动启动集群堆栈。

命令 “crsctl disable crs” 会更新 “/etc/orale/scls_scr/<host_name>/root/ohasdstr“. crs自动启动的标记,值只有2个 “enable” or “disable” .

当然crs 自动启动,也可以排除,因为手动启动一样失败。

这个案例中只有一个ohasd.service, 并且crs 也未禁用,我们手动再创建一个service. 名叫ohas,不要和ohasd重名。

创建服务启动,依旧未启动也无日志

有些案例Redhat还建议过修改启动不配置管道,输出日志,如/etc/inittab中

尝试无解

为什么要手动创建service? 因为该环境有个ohasd启动的bug,并且判断也未安装Patch.

由于 Oracle Linux 7(和 Redhat 7)使用 systemd 而不是 initd 来启动/重启进程并将其作为服务运行,因此当前 11.2.0.4 和 12.1.0.1 的软件安装将不会成功,因为 ohasd 进程无法正常启动。已知问题在于 OL7 期望使用 systemd 而不是 initd 来运行和重启进程,而 root.sh 目前无法处理这种情况。

该问题已在以下未公开的错误报告中提及。

Bug 18370031 – 集群软件 OL7 上的 RC 脚本(/ETC/RC.D/RC.,/ETC/INIT.D/

清理socket套接字

调用 crsctl start crs 手动启动集群堆栈。许多 Grid Infrastructure 后台进程依赖于 /var/tmp/.oracle 中创建的套接字。

ohasd.bin 无法启动的另一个原因是:$GRID_HOME 目录下的文件系统可能已损坏或未挂载。前面提到过,ohasd.bin 位于 $GRID_HOME/bin 目录下。如果 $GRID_HOME 目录未挂载,则无法启动该守护进程。

重建tmp/.oracle后,启动依旧失败。手动调用 /etc/init.d/init.ohasd run 确实能看到 tmp/.oracle目录中生成了npohasd 文件,无其他套接字。

重启操作系统同样无解。

手动启动ohasd.bin

原来是执行的链接库出现了问题。 下面决定relink GI_HOME。

relink GI HOME

这里的perl 脚本还缺少库文件,从oracle copy的操作系统下即可。

relink后,perl rootcrs.pl -patch 直接拉起了GI.

ok, 到此问题解决。

小结:

启动无响应从找回olr文件,重建ohas.service, 清理tmp, 最后再relink GI HOME,最终解决了OHASD无法启动的问题。

此条目发表在Oracle, Oracle troubleshooting分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注