系统开关机时oracle自启动和关闭脚本(for aix和linux)

时间:2022-02-23 15:36:04

前言:

作为一名oracle DBA,有没有遇到过大半夜被电话吵醒,被告知服务器故障重启了,现在数据库服务不可用,麻烦回来启动下数据库?

作为一名oracle DBA,有没有遇到过系统组的同事跟你讲,今晚要停机维护,麻烦留下来停一下数据库?

作为一名oracle DBA,更有甚者,在这个虚拟化泛滥的时代,有没有遇到过物理主机硬件故障,导致几十台数据库server发生了重启,麻烦启动下数据库?

 

~~~~~~~~~~~~~~先心疼自己三秒钟 ~~~~~~~~~~~~~~~~~~

其实ORACLE从一开始就提供了数据库开机自启动的脚本,只是考虑到可控性和配置稍稍有点复杂,很多人不愿意去尝试。

正好有时间就把oracle自启动和关闭的脚本作了一些优化,以增加脚本的适用性,并把自启动和关闭的配置写到了初始化脚本auto_start_db.sh,这样只需要简单一步执行auto_start_db.sh脚本就可以完成所有配置工作。

以下:

1.AIX和Linux操作系统平台下,oracle自启动和关闭的开关在/etc/oratab文件,/etc/oratab实在创建数据库时由root.sh脚本创建,在用DBCA创建实例时也会更新这个文件。当$ORACLE_SID:$ORACLE_HOME:<N|Y>设置为Y时,允许实例自启动,当设置为N时,则不允许自启动。 这个文件里的配置仅仅起一个开关的作用,其并不会具体的执行启动和关闭,具体的操作由$ORACLE_HOME/bin/dbstart和dbshut 脚本来实现。 这2个脚本在执行时会检查/etc/oratab文件里的配置,为Y时才能继续执行。(具体说明见oratab注释)

2. oracle自启动和关闭的脚本直接调用oracle自带的dbstartdbshut即可。如上所述,脚本需要做一下修改,以增强适用性。

 

譬如,dbstartdbshut脚本都只能针对默认的listener,如果新建了listener或者更改过listener名,那么脚本就无法正确执行。

所以需要,

#完善listener启动和停止脚本,增加判断listener是否是默认的listenername,以及针对多个listener的情况,循环启动每个listener(包括默认的和重命名的listener)。

 

再比如,对于Dataguard环境,dbstart和dbshut脚本并没有做判断,以致于physical standby数据库时没法通过脚本启动到Recover managed standby模式。

所以需要,

#完善instance启动脚本,增加判断数据库为primarydb还是standby db,然后再相应地启动数据库。

 

3.创建dbora脚本,调用$ORACLE_HOME/bin/下的dbstart和dbshut实现自动启动和关闭。

For linux:  vi/etc/init.d/dbora

For Aix:              vi/etc/dbora

(NOTE:修改ORACLE_HOME和ORACLE_OWNER参数值)

 

#! /bin/sh

# description: Oracle auto start-stopscript.

#

# Set ORACLE_HOME to be equivalent to the $ORACLE_HOME

# from which you wish to execute dbstartand dbshut;

#

# Set ORA_OWNER to the user id of the ownerof the

# Oracle database in ORACLE_HOME.

 

ORA_HOME=<Type your ORACLE_HOME in fullpath here>

ORA_OWNER=<Type your Oracle account namehere>

 

case "$1" in

'start')

    #Start the Oracle databases:

    #The following command assumes that the oracle login

    #will not prompt the user for any values

    #Remove "&" if you don't want startup as a background process.

   su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME" &

   touch /var/lock/subsys/dbora

   ;;

 

'stop')

    #Stop the Oracle databases:

    #The following command assumes that the oracle login

    #will not prompt the user for any values

   su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME" &

   rm -f /var/lock/subsys/dbora

   ;;

esac

 

4.在OS的适当的运行级脚本目录中创建dbora脚本的软链接(AIX平台和LINUX平台会有所差别,根据当前OS的运行级别来判断)。

For Linux:

# ln -s /etc/init.d/dbora/etc/rc.d/rc0.d/K01dbora

# ln -s /etc/init.d/dbora /etc/rc.d/rc6.d/K01dbora

# ln -s /etc/init.d/dbora/etc/rc.d/rc3.d/S99dbora

# ln -s /etc/init.d/dbora/etc/rc.d/rc5.d/S99dbora

 

For Aix:

# ln -s /etc/dbora /etc/rc.d/rc2.d/S99dbora

# ln -s /etc/dbora /etc/rc.d/rc0.d/K01dbora.

 

注意,这里有个坑,对于linux平台下的DG环境,dbora脚本在OS启动时可以放到init 3 或者init 5,但是reboot时一定不能放到init 5.放到init 5 会导致备库shutdown immediate时遭遇active call prevent shutdown operation。Active call就是备库的RFS进程,在OS层已经停止了部分服务(譬如IP配置、tcp连接)使RFS进程hung住,而pmon进程无法kill掉该进程似的shutdown无法继续。

 

为了避免一些手工配置的坑,我把自启动和关闭的配置写到了初始化脚本,这样只需要简单一步执行auto_start_db.sh脚本就可以帮助完成所有配置和脚本优化工作。

是不是很high?

脚本可以免费提供给大家,有需要的,可以在评论留下邮箱或者私信索取。