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!