SHELL脚本实现Oracle自启动与关闭

 

前言:通过SHELL脚本实现Oracle自启动与关闭方法很多,脚本也很简单,本例是通过编写一个简单的脚本来调用Oracle10g自带的3个脚本来实现。现在开始吧
 
首先我们把Oracle自带的3个脚本简单的编辑一下,这3个脚本的目录分别位于:
 
/etc/oratab
$ORACLE_HOME/bin/dbstart
$ORACLE_HOME/bin/dbshut
 
vi  /etc/oratab
qdyx:/opt/app/oracle/product/10/db:Y
+ASM:/opt/app/oracle/product/10/db:Y
 
将确认启动域置为“Y”,这样做的好处是当系统中存在多个实例时,我们可以选择性的进行操作。
 
vi  $ORACLE_HOME/bin/dbstart
ORACLE_HOME_LISTNER=$ORACLE_HOME
找到“ORACLE_HOME_LISTNER”将他的值修改为“$ORACLE_HOME
 
vi  $ORACLE_HOME/bin/dbshut
在文件未尾加入一行:lsnrctl stop
dbshut默认只关闭/etc/oratab中设置为“Y”的数据库,并不关闭监听器。
准备工作做好了,编辑一个简单的脚本来调用oratabdbstartdbshut
 

  1. #! /bin/bash 
  2. case "$1" in 
  3.       start) 
  4.       echo "Starting Oracle Listener and Database....." 
  5.       echo "----------------------------------------------" >> /var/log/oracle.log 
  6.       echo "`date +%T%a%D`:Starting Oracle Listener and Database....." >> /var/log/oracle.log 
  7.       echo  "---------------------------------------------" >> /var/log/oracle.log 
  8.       su - oracle -c dbstart >> /var/log/oracle.log 
  9.       echo "Done" 
  10.       echo "" 
  11.       echo "----------------------------------------------" >> /var/log/oracle.log 
  12. ;; 
  13.       stop) 
  14.       echo "stoping Oracle Listener and Database....." 
  15.       echo "----------------------------------------------" >> /var/log/oracle.log 
  16.       echo "`date +%T%a%D`:Stoping Oracle Listener and Database....." >> /var/log/oracle.log 
  17.       echo  "---------------------------------------------" >> /var/log/oracle.log 
  18.       su - oracle -c dbshut >> /var/log/oracle.log 
  19.       echo "Done" 
  20.       echo "" 
  21.       echo "----------------------------------------------" >> /var/log/oracle.log 
  22. ;; 
  23.       *) 
  24.       echo "Usage: oracle{start | stop}" 
  25. ;; 
  26. esac 
将上面的脚本命名为oralce,放在/etc/init.d/目录下,并添加可执行权限。完了,可以执行脚本做下数据库打开与关闭的测试。到这里马上快完了,耐心一点,呵呵!!!
 
接下来,我们要让Linux系统在启动与关闭的时候能够执行这个脚本。
首先是启动时执行这个脚本,我运行在启动级别5下,建立一个软链接:
ln -s /etc/rc.d/init.d/oracle  /etc/rc.d/rc5.d/S99oracle
如果你的系统运行在启动级别3,将rc5.d变成rc3.d就行了,这个S99Oracle是什么意思呢,简单解释下,S表示在系统启动时会向脚本传递一个start的参数,99表示最后执行这个脚本,如果有兴趣可去这个目录看下就明白了。
 
关闭时执行这个脚本,在启动级别06都要建软链接,0表示关闭系统,6表示重启系统。
ln -s /etc/rc.d/init.d/oracle  /etc/rc.d/rc0.d/K01oracle
ln -s /etc/rc.d/init.d/oracle  /etc/rc.d/rc6.d/K01oracle
K01啥意思,K表示在关闭时向脚本传递一个stop参数,01表示最先关闭。
 
好了,到这里就真的完了,查看数据库启停信息可以去这2个目录
/var/log/oracle.log
$ORACLE_HOME/startup.log
 
做完以上工作,基本就成功了,第一次重启测试,发现竟然没起来,大汗啊,赶紧看日志,在startup.log中发现大量下面信息:
Failure 1 contacting CSS daemon
logger: Waiting for Oracle CSS service to be available before starting 
logger:  ASM instance +ASM. Wait 1.
Failure 1 contacting CSS daemon
logger: Waiting for Oracle CSS service to be available before starting 
logger:  ASM instance +ASM. Wait 2.
Failure 1 contacting CSS daemon
logger: Waiting for Oracle CSS service to be available before starting 
logger:  ASM instance +ASM. Wait 3.
Failure 1 contacting CSS daemon
logger: Waiting for Oracle CSS service to be available before starting 
logger:  ASM instance +ASM. Wait 4.
Failure 1 contacting CSS daemon
logger: Waiting for Oracle CSS service to be available before starting 
logger:  ASM instance +ASM. Wait 5.
Failure 1 contacting CSS daemon
logger: Waiting for Oracle CSS service to be available before starting 
logger:  ASM instance +ASM. Wait 6.
 
网上查了下,据说是一个Bug,通过这种方法解决,在/etc/inittab中添加一行,注意位置:
l2:2:wait:/etc/rc.d/rc 2
h1:35:respawn:/etc/init.d/init.cssd run >/dev/null 2>&1 </dev/null
l3:3:wait:/etc/rc.d/rc 3
好了,一切终于OK!