標籤:
最近,ORACLE系統基本調試通過,是時候設定ORACLE隨RHEL自動啟動與關閉服務的時候了,之所以把這個任務放在最後來做,是因為我覺得這個應該不會很難,但真正實施起來,還是遇到了個不小的障礙:寫好指令碼,註冊好服務之後,經測試,ORACLE可以隨RHEL啟動而啟動,但不能隨系統關閉而關閉。在網上找答案,發現幾乎所有的設定過程文章都是從同一篇原樣照抄過來的,根本就行不通。天下文章一大抄。求助他人,沒有得到一個好的解決方案。無奈,自己靜下心來慢慢研究分析,總算找到了問題的關鍵原因所在。
現在就把我的整個成功設定的過程貼出來,供大家參考,以期大家能少走彎路;另外還是要給其他人一個建議:切莫生硬照搬,斷章取義,否則其害大焉!!
首先,要在RHEL中設定允許ORACLE系統自動啟動,因為預設情況下是設定為不允許的。操作如下:
在root賬戶下修改/etc/oratab 檔案:
# vi /etc/oratab
找到orcl=/db/app/oracle/product/11.1.0/db_1 :N這一行
改為:
orcl=/db/app/oracle/product/11.1.0/db_1 :Y
也就是將最後的N改為Y,意思是將不允許自動啟動改為允許自動啟動。
然後,是修改ORACLE內建的啟動與關閉指令碼,分別是dbstart和dbshut。執行這兩個指令碼就可以實現ORACLE指令碼的啟動與關閉。
在oracle賬戶下修改$ORACLE_HOME/bin/dbstart檔案:
# su - ORACLE
$ cd $ORACLE_HOME/bin
$ vi dbstart
找到 ORACLE_HOME_LISTNER=$1這一行
改為:
ORACLE_HOME_LISTNER=$ORACLE_HOME
之所以做這一步,是因為在這個指令碼自動產生的時候,也就是ORACLE被安裝進RHEL的時候,這個指令碼並不知道你的
ORACLE_HOME_LISTNER是什麼,現在要將這個參數顯示的寫明,這樣就不會在執行這個指令碼的時候報
ORACLE_HOME_LISTNER沒有被指定的錯誤了。注意:dbstart和dbshut指令碼在10g之後就已經將監聽器的啟動與關閉合并進數
據庫執行個體的啟動與關閉指令碼裡面了。而不再是單獨分開的了。
同樣的方式,我們也要修改dbshut的這個參數。這裡就不再詳細寫出了,他們在同一個目錄下。
再次,就是寫一個指令碼,把它註冊為一個系統服務,讓它在開機與關機的時候運行。它的作用就是調用並執行dbstart和dbshut。這樣不
就實現了資料庫啟動與關閉了嗎?!這個指令碼被放在/etc/init.d目錄中,指令碼的名字是oracle11
指令碼如下:
#!/bin/bash
# chkconfig: 2345 99 10
# description: Startup Script for oracle Databases
# /etc/rc.d/init.d/oradbstart
export ORACLE_BASE=/db/app/oracle/
export ORACLE_HOME=/db/app/oracle/product/11.1.0/db_1
export ORACLE_SID=orcl
export PATH=$PATH:$ORACLE_HOME/bin
case "$1" in
start)
echo "-----startup oracle-----" >> /var/log/oracle11log
su oracle -c $ORACLE_HOME/bin/dbstart
touch /var/lock/subsys/oracle11
echo "-----startup oracle successful-----" >> /var/log/oracle11log
echo "OK"
;;
stop)
echo "-----shutdwn oracle-----" >> /var/log/oracle11log
su oracle -c $ORACLE_HOME/bin/dbshut
rm -f /var/lock/subsys/oracle11
echo "-----shutdown oracle successful-----" >> /var/log/oracle11log
echo "OK"
;;
*)
echo "Usage: ‘basename $0‘ start|stop"
exit 1
esac
exit 0
儲存並退出。
現在,我要對這段指令碼做一個關鍵解釋:
第一:# chkconfig: 2345 99 10 雖是一行注釋,但是確實關鍵的必不可少的一行,除非你不用chkconfig命令來自動產生符號串連檔案,而是完全採用手工建立。否則沒有這一行,執行chkconfig系統將會報出oracle11沒有chkconfig服務許可權的錯誤。
第二:su oracle -c $ORACLE_HOME/bin/dbstart 和touch /var/lock/subsys/oracle11這兩行的作用是首先執行dbstart指令碼啟動oracle,然後在服務活動列表目錄中建立一個與oracle11這個服務同名的一個檔案,表示這個服務是活動的,也就是被啟動的。
而su oracle -c $ORACLE_HOME/bin/dbshut 和rm -f /var/lock/subsys/oracle11這兩行的作用是首先執行dbshut急哦指令碼關閉oracle,然後從服務活動列表目錄中刪除那個與oracle11同名的那個檔案,表示這個服務不是活動的,也就是已經被關閉。
那麼為什麼要做touch /var/lock/subsys/oracle11和rm -f /var/lock/subsys/oracle11這兩步呢?原因是跟LINUX系統的機制有關的:LINUX的判別一個服務是否被啟動的依據是在/var/lock/subsys/目錄下是否與服同名的檔案,若有則表示這個服務已經被啟動了,在系統關閉的時候,LINUX會把這裡面列出的服務全部關閉,並刪掉與服務同名的檔案。若一個服務被啟動了,但卻在這個目錄裡沒有那個服務的同名檔案,則不會關閉那個服務。網上的文章均將這個地方設定錯了,所以會發現,ORACLE可以隨系統啟動了,但卻沒有隨系統關閉。我也是分析了/etc/rc.d/rc.local後才發現這個原理的。經過實驗,果然如此。再分析mysql的啟動與關閉指令碼也是這樣做的,最終恍然大悟。原來如此。這個地方請大家注意了。
最後,就是將這個指令碼註冊成為一個系統服務就可以了,方法有二:
其一:先給指令碼分配可以被執行的許可權。執行下面命令:
#su - root
chown oracle /etc/init.d/oracle11
chmod 775 /etc/init.d/oracle11
再建立符號連結檔案。
chkconfig --add /etc/init.d/oracle11,執行這個命令就需要你在指令碼中寫上# chkconfig: 2345 99 10 了。這樣當這個命令被執行的時候,回去oracle11檔案中尋找這行注釋,並解析這行注釋,根據解析結果分別在/etc/rc.d/rc2.d;/etc/rc.d/rc3.d;/etc/rc.d/rc4.d;/etc/rc.d/rc5.d中建立符號串連檔案S99oracle11檔案,這個檔案是系統啟動時要執行的,其實這個檔案是指向/etc/init.d/oracle11的,啟動的時候系統向這個檔案發送一個start參數,也就執行了oracle11檔案中的start分支了。還會在/etc/rc.d/rc0.d;/etc/rc.d/rc1.d;/etc/rc.d/rc6.d中建立K10oracle11檔案,這個檔案時系統關閉時要執行的,其實這個檔案也是指向/etc/init.d/oracle11的,關閉的時候系統向這個檔案發送一個stop參數,也就執行了oracle11檔案中的stop分支了。
我想你應該明白# chkconfig: 2345 99 10 中這些數位含義了吧:指出2,3,4,5層級啟動這個服務,99是在相應的/etc/rc.d/rcN.d(N為前面指定的層級,這裡是2345)目錄下產生的連結檔案的序號(啟動優先順序別)S99oracle11,10為在除前面指出的層級對應的/etc/rc.d/rcN.d(N為除2345之外的層級)目錄產生的連結檔案的序號(服務停止的優先順序別)K10oracle11。至於為什麼在這些目錄中建立檔案和檔案的命名規則,這就要您對LINUX的系統啟動流程有一個熟悉的瞭解了,在這就不詳談了。
其二:若您想嘗試一下手動建立符號串連檔案的樂趣,請執行如下命令:
#su - root
ln -s /etc/init.d/oracle11 /etc/rc.d/rc2.d/S99oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc3.d/S99oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc4.d/S99oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc5.d/S99oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc0.d/K10oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc1.d/K10oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc6.d/K10oracle11
作用效果和執行chkconfig --add oracle11是一樣的。
到此,所以得設定過程就結束了,下面進行一下測試吧:
#cd /etc/init.d
sh oracle11 start
執行後,看看/var/log目錄下的oracle11log檔案,裡面是不是有指令碼的啟動分支輸出資訊呢?
sh oracle11 stop
執行後,看看/var/log目錄下的oracle11log檔案,裡面是不是有指令碼的關閉分支輸出資訊呢?
若看到資訊,表示您設定成功了。若沒有,請再仔細設定一遍,並注意檔案的許可權問題。LINUX的使用者概念是很嚴格的。畢竟是多使用者系統嘛。
文章屬於作者原創,轉載請註明出處。來自:http://blog.csdn.net/kanon_lgt/
詳細出處參考:http://www.jb51.net/article/19823.htm
詳細出處參考:http://www.jb51.net/article/19823.htm
詳細出處參考:http://www.jb51.net/article/19823.htm
Oracle 11g隨Redhat 5系統自動啟動與關閉的設定方法