利用dbstart和dbshut指令碼自動啟動和停止資料庫的問題

路途中的人2012發表於2016-12-30
        客戶的兩臺IBM Power 740小型機使用HACMP軟體建立互備關係的資料庫伺服器,每臺小型機執行一個資料庫,任何一臺伺服器出現故障當機,另一臺小型機應該立即接管,且要一併接管資料庫,這時在一臺小型機上就執行了兩個資料庫,故障伺服器恢復正常之後,相應的資料庫會自動切換回主機。

        在出現故障和恢復時,HACMP必須在兩臺小型機上呼叫啟動和停止Oracle資料庫的指令碼完成切換過程,大部分的朋友應該和我一樣應該會考慮使用Oracle的dbstart和dbshut指令碼來生成相應的指令碼。

        我也是這麼做的,但這麼做了之後在測試過程中發現瞭如下一個問題:
        1).正常啟動HACMP之後,兩個資料庫正常的在兩個小型機上執行。
        2).小型機A出現故障,資料庫A被正常的切換到了小型機B上執行。
        3).小型機A恢復正常,原有資料庫正常的切換了回來,但這時執行在小型機B上的資料庫當機了。

         上面的現象是什麼原因喃,我檢視了相關的文件,下面是一段很重要的文字描述:
        Oracle recommends that you configure your system to automatically start Oracle Database when the system starts up, and to automatically shut it down when the system shuts down. Automating database startup and shutdown guards against incorrect database shutdown.
       
         Oracle推薦配置在系統啟動的時候自動啟動Oracle資料庫,當系統關閉的時候自動關閉資料庫,自動化資料庫的啟動和關閉是為了防止不正確的資料庫關閉

        To automate database startup and shutdown, use the dbstart and dbshut scripts, which are located in the $ORACLE_HOME/bin directory. The scripts refer to the same entries in the oratab file, which are applied on the same set of databases. You cannot, for example, have the dbstart script. automatically start sid1, sid2, and sid3, and have the dbshut script. shut down only sid1. However, you can specify that the dbshut script. shuts down a set of databases while the dbstart script. is not used at all. To do this, include a dbshut entry in the system shutdown file, but do not include the dbstart entry from the system startup files.

        為了實現自動化啟動和關閉資料庫,需要使用存放在$ORACLE_HOME/bin目錄下的dbstart和dbshut指令碼,這兩個指令碼引用/etc/oratab檔案中的相同條目,應用於在相同的資料庫集。不能有如下的情況,例如,使用dbstart指令碼自動的開始sid1,sid2和sid3資料庫,同時只使用dbshut指令碼停止sid1資料庫,這是做不到的。然而可以在不使用dbstart指令碼啟動資料庫的情況下,指定使用dbshut指令碼來停止資料庫集。如果你想這麼做,將包含dbshut指令碼的條目寫入作業系統停止檔案,但是不要將包含dbstart指令碼的條目寫入作業系統的啟動檔案中。

       在使用dbstart和dbshut指令碼啟動和停止資料庫之前需要先將儲存在/etc/oratab配置檔案中的資料庫屬性修改為Y,格式如下:sid:oracle_home_directory:[Y|N],然後就可以在系統啟動配置檔案和系統停止配置檔案中加入dbstart和dbshut指令碼使得系統在啟動和異常關閉的情況下先啟動和正常關閉資料庫,避免資料庫不正常的關閉帶來的損失。指令碼標準的用法是:
dbstart $ORACLE_HOME
dbshut $ORACLE_HOME

        從上面的描述我們可以瞭解到,如果一臺伺服器上有多套Oracle資料庫,那麼沒法控制使用dbstart和dbshut指令碼啟動和停止某一個資料庫,兩個指令碼會將/etc/oratab配置檔案中屬性修改為Y的資料庫都啟動和停止,這就是出現最開始描述的問題的原因。

        為了解決這個問題,只有手動寫指令碼來固定啟動和停止某個資料庫,下面是一個例子:

1).自動啟動指令碼。
root使用者下面的指令碼:
##############################################################

## start oracle server

echo "`hostname`:The ORACLE Server typt is starting,Please Waiting."

sleep 3

su - oracle -c "./a_start.sh"

sleep 3

echo "`hostname`:The ORACLE Server typt is started."

##############################################################

oracle使用者下面的指令碼:
a_start.sh

echo "Switch To typt"
export ORACLE_SID=typt

lsnrctl start

echo "Start Oracle DataBase typt Begin"

sqlplus /nolog  <<EOF

connect /as sysdba

startup

exit

EOF

sleep 3

echo "Start Oracle DataBase typt End"

        HACMP透過root使用者下的指令碼呼叫a_start.sh指令碼完成對監聽器和資料庫的自動啟動。

2).自動停止指令碼。
root使用者下的指令碼:
##############################################################

## stop oracle server

echo "`hostname`:The ORACLE Server typt is stopping,Please Waiting."

su - oracle -c "./a_stop.sh"

sleep 5

echo "`hostname`:The ORACLE Server typt is stoped."

##############################################################

oracle使用者下的指令碼:
a_stop.sh

echo "Switch To typt"
export ORACLE_SID=typt

echo "Stop Oracle DataBase typt Begin"

sleep 5

sqlplus /nolog <<EOF

connect /as sysdba

shutdown immediate

exit

lsnrctl stop

EOF

echo "Stop Oracle DataBase typt End"

         以上是自動停止Oracle資料庫的指令碼,HACMP透過root使用者下的指令碼呼叫a_stop.sh指令碼自動停止Oracle資料庫,兩個指令碼都是透過設定ORACLE_SID環境變數來明確的啟動、停止資料庫。

--end--

       感謝同事老譚對我的幫助!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-2131674/,如需轉載,請註明出處,否則將追究法律責任。

相關文章