2020年8月25日 星期二

4.7 啟動與關閉資料庫

Oracle 資料庫的啟動與關閉必須透過sqlplus來執行,如果是Windows平台,則可以從windows service直接啟動與關閉資料庫。


使用 sqlplus 啟動或關閉資料庫時,必須先設定環境變數 ORACLE_SID,例如在unix 作業系統上要啟動orcl這個資料庫時必須先執行export ORACLE_SID=orcl,然後再進入sqlplus裡面執行startup。


ORACLE_SID代表的是資料庫的instance_name,主要是告訴作業系統說我要啟動哪一個資料庫,然後他會去載入相關的參數檔 (pfile, init<SID>.ora 或是 spfile, spfile<SID>.ora) 進行啟動,如果 ORACLE_SID 與參數檔的設定無誤,那麼資料庫就可以開啟了:

 

資料庫從開始啟動到啟動完成總共會經歷三個階段:

nomount: 開始啟動 instance 並載入參數檔裡面的設定。

mount: 確認controlfile 是否存在並載入 controlfile 的設定。

open: 最後階段,檢查所有 datafile 是否存在,而且所有file的scn是否一致,檢查通過後正常開啟資料庫。

資料庫在開啟的時候可以指定要開啟到哪一個階段:

SQL> startup

     (直接開到 open)

SQL> startup mount

     (開啟到 mount 狀態)

SQL> startup nomount

     (開啟到 nomount 狀態)

SQL> alter database mount;

     (將資料庫從 nomount 開啟到 mount 狀態)

SQL> alter database open;

     (將資料庫從 mount 狀態開啟到 open)


一般來說只有在進行資料庫特殊維護作業的時候才會指定開啟到某一個狀態。在nomount狀態下只有載入參數檔,因此開到nomount可以進行參數的更改、還原(restore) controlfile;在mount狀態下只有載入參數檔與controlfile,可以在這個狀態下進行資料庫的還原(restore/recover)、更改datafile/redo log 的名稱或路徑、進行archive/noarchive 模式的轉換…等。


除此之外,Oracle資料庫還可以開啟到限制模式(restrict) 與唯讀模式(read only):

SQL> startup restrict

     (開啟到限制模式,只有具有 sysdba 權限的使用者可以登入)

SQL> alter database open read only;

     (將資料庫從 mount 狀態開啟到唯讀模式)


關閉資料庫使用的是shutdown 指令,shutdown 後面有四種模式可以選擇:


shutdown normal: 

預設選項,只有執行shutdown則表示為shutdown normal,在此模式下會等待已連接的session全部自行登出後才會進行shutdown動作。一般來說,連接資料庫的使用者來自四面八方,不太可能要求或是等待全部使用者自行登出,因此不太會使用此種模式來關閉資料庫。


shutdown immediate:

最常使用的模式,執行shutdown immediate會強制踢出所有的連線,如果有正在執行的交易會強制rollback後再關閉資料庫。


shutdown abort:

直接關閉資料庫,類似將機器power off的動作,執行shutdown abort之後所有的連線直接踢出,正在執行的交易也是馬上踢出不會進行rollback。因為交易執行到一半突然被中斷掉了,所以在資料庫重新開啟時必須進行recover的動作將未執行完畢的交易進行修復,正常情況下在啟動時SMON會嘗試做Instance recovery 的動作,如果SMON無法成功完成recover,那麼就必須使用備份來還原資料庫了。此種模式下關閉資料庫存在著資料不一致且資料庫無法開啟的風險,因此在非必要的情況下不會使用此模式關閉資料庫。


shutdown transactional:

此種模式會踢出所有的連線,但是正在執行的交易不會強制rollback,會等到所有進行的交易自行結束後才會關閉資料庫。


同樣的,資料庫從開始關閉到關閉完成總共也是會經歷三個階段:

Closed: 關閉資料庫所有正在進行的transaction。

Dismounted: 將資料庫進行卸載,把目前的狀態寫回control file。

Instance shutdown: 完成資料庫的關閉。


如果是使用shutdown abort的話,則不會經過closed與dismounted階段,直接Instance shutdown。


 

不同於startup的是,資料庫在11g之前並不能指定他要關閉到哪一個階段,而在Oracle 11g之後提供了 alter database close 與 alter database dismount 兩個指令,讓資料庫可以關閉到某一個階段:

SQL> alter database close

     (從 open 狀態關閉至 mount 狀態)

SQL> alter database dismount

     (從 mount 狀態關閉至 nomount狀態)


而關閉資料庫的順序是不可逆的,例如執行了alter database close之後就不能再執行 alter database open,只能再 alter database dismount一路的關閉下去。


alter database close 指令並不會強制踢出所有連線,必須所有的資料庫連線自行登出後才有辦法執行 alter database close,因此這個命令的實用性並不高,一般正常關閉資料庫的方式都是直接使用 shutdown immediate 指令。




沒有留言:

張貼留言