2007年10月25日 星期四

linux自動啟動及停止 Oracle 資料庫

以下文字是參考http://www.linux.org.tw/CLDP裡的文件做成,
感謝linux.org.tw的前輩們,
無私而且不辭辛勞的把linux各種技術分享出來!

在此吳大我也將遵循linux共享奉獻的精神,
把我成功設定oracle 10g資料庫,
可以在linuxOS開關機時,自動把資料庫啓動及關閉的經驗分享給大家。
希望能對那些在做oracle 10g DBA的朋友們,有所助益!

要達成在linuxOS開關機時,可以把oracle 10g資料庫啓動及關閉。
你需要對linux的runlevel運作模式有所概念,
然後運用以下三份命令稿,就能達成我們的目的了。

我正式在跑資料庫的主機作業系統是RHEL3,
但我在CentOS環境作同樣的設定也相容。
可見和RedHat有血緣關係的linux版本,應該都適用我這份文件內容才對!

以oracle帳號登入吧!
首先,要在你oracle帳號的$PATH定義中,
能找到/home/oracle/bin這個路徑,
因為我們要把兩個命令稿分別叫 dbstartup 和 dbshutdown 放在這裡!
用echo看看PATH變數,確認一下吧!
[oracle@testhost oracle]$ echo $PATH

没有的話,可能你要修改一下你的.bash_profile或是.profile檔案,
反正就是在定義使用者登入時環境變數的檔案就是了。
語法應該會是:
PATH=$PATH:~/bin

PATH=$PATH:/home/oracle/bin
都行!寫在你的.bash_profile或.profile的最後一行也行。

接著,以下是兩個檔案的內容,
要放在/home/oracle/bin的!

[oracle@testhost oracle]$ vi dbstartup
+-----------------------------------------------------------------------------------------------+
#dbstartup
#/home/oracle/bin
sqlplus / as sysdba <<EOF
startup
exit
EOf
:wq 離開vi ,產生dbstartup檔案!

[oracle@testhost oracle]$ vi dbshutdown
+-----------------------------------------------------------------------------------------------+
#dbshutdown
#/home/oracle/bin
sqlplus / as sysdba <<EOF
shutdown immediate
exit
EOF
:wq 離開vi ,產生dbshutdown檔案!

記得要有執行權限的檔案屬性給它們。
[oracle@testhost oracle]$chmod +x dbstartup dbshutdown

做到這裡,等於你成功一半了,
但了為保險起見,我們還是測一下這兩命令稿的效果好了。
免得高興得太早,資料庫動也不動。
[oracle@testhost oracle]$ dbshutdown

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 26 13:42:23 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[oracle@testhost oracle]$

由於之前我己經把資料庫開起來了,所以執行可以dbshutdown來關資料庫。
好,那你可以再用dbstartup試試,應該也没問題的!
因為語法大同小異,其實就startup和shutdown immediate的差異而己啊!
嗯!測試成功!我們可以繼續了...

下面這個命令稿和相關設定比較複雜些,
我簡單說明一下,它以bash的case判斷式,
再運用su -l oracle -c "oracle-command"的方式,
去呼叫之前的dbstartup和dbshutdown。
來達到如我們在啓動一些服務的效果!

啓動oracle 10g 資料庫服務:
[oracle@testhost oracle]$ sudo /etc/rc.d/init.d/oracle start

關閉oracle 10g 資料庫服務:
[oracle@testhost oracle]$ sudo /etc/rc.d/init.d/oracle stop

重啓oracle 10g 資料庫服務:
[oracle@testhost oracle]$ sudo /etc/rc.d/init.d/oracle restart

我用sudo是要以root身份執行,但如何讓oracle有執行sudo,
不在這次的題目中,請另行處理吧!
OK,當/etc/rc.d/init.d/oracle這個命令稿有上述的功能後,
我們再進一步設定成linuxOS主機可以在開機關機時,
也能够把資料庫服務一併開關就完成我們這次主題的終極目標了。


[oracle@testhost oracle]$ sudo vi /etc/rc.d/init.d/oracle
+-----------------------------------------------------------------------------------------------+
#!/bin/sh
# /etc/rc.d/init.d/oracle
#linux自動啟動及停止 Oracle 資料庫和監聽程式

case "$1" in
start)
echo -n "Starting Oracle 10g Databases : "
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Starting Oracle 10g Databases as part of system start." >> /var/log/oracle
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
echo -n "Oracle 10g Databases Starting : "
su - oracle -c dbstartup >> /var/log/oracle
echo "Done."
echo -n "Oracle 10g Listeners Starting : "
su - oracle -c "lsnrctl start" >> /var/log/oracle
echo "Done."
# echo -n "Oracle 10g OEM Starting : "
# su - oracle -c "emctl start dbconsole" >> /var/log/oracle
# echo "Done."
echo ""
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Finished." >> /var/log/oracle
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
touch /var/lock/subsys/oracle
;;
stop)
echo -n "Shutting Down Oracle 10g Listeners : "
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Shutting Down Oracle 10g Databases as part of system down." >> /var/log/oracle
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
# echo -n "Oracle 10g OEM Stopping : "
# su - oracle -c "emctl stop dbconsole" >> /var/log/oracle
# echo "Done."
echo -n "Oracle 10g Listeners Stopping : "
su - oracle -c "lsnrctl stop" >> /var/log/oracle
echo "Done."
rm -f /var/lock/subsys/oracle
echo -n "Shutting Down Oracle 10g Databases : "
su - oracle -c dbshutdown >> /var/log/oracle
echo "Done."
echo ""
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Finished." >> /var/log/oracle
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
;;
restart)
echo -n "Restarting Oracle 10g Databases: "
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Restarting Oracle 10g Databases as part of system up." >> /var/log/oracle
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
echo -n "Shutting Down Oracle 10g Databases : "
su - oracle -c dbshutdown >> /var/log/oracle
echo "Done."
echo -n "Oracle 10g Databases Starting : "
su - oracle -c dbstartup >> /var/log/oracle
echo "Done."
echo -n "Oracle 10g Listeners Stopping : "
su - oracle -c "lsnrctl stop" >> /var/log/oracle
echo "Done."
# echo -n "Oracle 10g OEM Stopping : "
# su - oracle -c "emctl stop dbconsole" >> /var/log/oracle
# echo "Done."
# echo -n "Oracle 10g OEM Starting : "
# su - oracle -c "emctl start dbconsole" >> /var/log/oracle
# echo "Done."
echo -n "Oracle 10g Listeners Starting : "
su - oracle -c "lsnrctl start" >> /var/log/oracle
echo "Done."
echo ""
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Finished." >> /var/log/oracle
echo "-------------------------------------------------------------------------------" >> /var/log/oracle
touch /var/lock/subsys/oracle
;;
*)
echo "Usage: oracle {start|stop|restart}"
exit 1
esac


以上內容,僅供參考,請視狀況修訂!
像是listener開關和資料庫開關的順序,
我個人的實際經驗是認為誰先誰後,並不影響資料庫的運作!
甚至listener可以保持在一定聆聽的狀況,只要重啓資料庫即可。

還有emctl的使用,若是用不到,就像我在內容中就註解掉不啓用了,
也可以讓機器效能好一點,不過好多少我没把握。

搞定這個最後的命令稿後,
我們要進入最後一個步驟了。
我們要在適當的執行等級目錄中 (/etc/rc.d/rcX.d),
建立符號連結 (symbolic links)。

讓我們以root身份來完成這最後的工程!畫下完美的句點吧!
[oracle@testhost oracle]$ sudo su -l root

切換成root後!
[root@testhost root]#
[root@testhost root]# cd /etc/rc.d/init.d
[root@testhost init.d]# ln -s ../init.d/oracle /etc/rc.d/rc3.d/S99oracle
[root@testhost init.d]# ln -s ../init.d/oracle /etc/rc.d/rc5.d/S99oracle
[root@testhost init.d]# ln -s ../init.d/oracle /etc/rc.d/rc0.d/K01oracle
[root@testhost init.d]# ln -s ../init.d/oracle /etc/rc.d/rc6.d/K01oracle

好了!我們己經在啓動的runlevel 3和5 做開機就啓動oracle的服務設定,
而關機的runlevel 0和重開機的runlevel 6也有關掉oracle的服務設定!
大功告成!

測試一次,現在我們不必再進資料庫關閉它了。
直接關閉機器!
[root@testhost init.d]# shutdown -r now

你應該可以在開關機的過程中,看到oracle 關閉啓動的訊息。
為了再求證我們這些設定是否有用,讓我們進資料庫看看狀況吧。

用oracle帳號登入!
[oracle@testhost oracle]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 26 15:56:15 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL>


手動啓動庫資料看看!
SQL> startup
ORA-01081: cannot start already-running ORACLE - shut it down first
SQL>

哈!資料庫already running了!成功!

吳大 2007/10/26

沒有留言:

搜尋此網誌

本站大事記

這個部落格(網站)內容以分享LINUX和延伸出的技術文章為主!
特別是為了工作和進修需要,搜集了不少網站連結。
希望對來這裡觀文的朋友們,有提供一些有用的資訊或文章。
但這裡的文章中,也包含個人的心情扎記和隨興言談……
若是當中沒有對上你的口味,請多包涵!

原「琳娜絲與希斯寇的邂逅」,改名為「愛上琳娜絲」!

原「琳娜絲與希斯寇的邂逅」,改名為「愛上琳娜絲」!
--原序文--
就是當LINUX遇上CISCO啦!他們的結合還能作什麼事…不就是讓這個世界的網路,串…串起來啊…不然你們那能上這網站看部落格!