前几天一位朋友在重启一个多节点rac ,而在关库过程中,使用 srvctl stop database 命令关闭所有rac 实例,可是其中一个节点一个多小时后还没有关掉,而停机的时间也就那么一个小时,这可把朋友急的团团转,不知道如何是好,最后迫于应用的压力这位朋友直接把OS 重启了,完了后,同事问题我以后怎么应对这样的问题。我笑了笑,以下为抛砖引玉。

 

重启操作系统回然可以强制关闭相应节点的实例,但从一个数据库运维角度来看,重启OS并不是最终的解决办法,回想一下oracle 的启动的过程如下所示,而oracle的关闭则与启动是一个相似的过程。wKiom1YrCH3RwKNjAAFG-w2w7Do294.jpg

我们不难发现在mount 前所有相关的后台进程必须起来才可以支撑起数据库的open,换句话说,数据库的运行也必须是由后台进程负责的,继而,我们又可以想到数据库之所以还在继续运程,必然就有相应的后台进程支撑(不凡用 ps –ef | grep ora_ 看看),直接重启服务器最终也是直接结束oracle 所有的前台与后台进程,来达到关闭oracle的目的。说到这里,这个问题也就不在是问题了。听我说完,这位朋友豁然开朗的说,直接kill 进程就好了。这固然没错,可也并不是随意把进程杀了,我们可以看看alert.log里面在写什么 ,做什么事,最终确认要不要kill,kill那个进程。

因此,当我们使用命令关闭数据库时,(srvctl stop database –d  相当于shutdownnormal)并不是每次都有效,就连shutdownimmediate 也如此,在很少的情况下使用abort 也会失效,这时我们可以使用ps –ef | grep smon 找出进程id,并结束相应的进程。

 

数据库的启动与关闭是每个DBA最常操作的命令不过了,但是并不是所有的dba 在运行这几个命令时都会一帆风顺,当我们遇到相应的问题时,不同的应用,不同的环境,便有不同需要我们具体情况具体分析,但这些方法与解决措施得益于我们对oracle 原理的理解与运用。所以,基本的概念与原理最终才是dba的生存的法宝。