前面提到過Oracle數(shù)據(jù)庫的四種方式月杉,分別是 shutdown
盗痒、nomount
、mount
和 open
谨设,對應著數(shù)據(jù)庫從關閉狀態(tài)到啟動狀態(tài)的四種形式熟掂。
而數(shù)據(jù)庫進行關閉時,同樣有四種關閉方式扎拣。分別是 abort
赴肚、immediate
、normal
和 transactional
二蓝。
官方提供的 shutdown
的語法為:
SHUTDOWN [ABORT | IMMEDIATE | NORMAL | TRANSACTIONAL [LOCAL]]
在Oracle數(shù)據(jù)庫中誉券,如果需要關閉一個正在運行的數(shù)據(jù)庫實例,可以選擇將數(shù)據(jù)庫 closing(關閉)
并且 dismounting(卸載)
刊愚。而如果數(shù)據(jù)庫是一個可插拔容器數(shù)據(jù)庫的實例踊跟,那么當通過 shutdown
關閉數(shù)據(jù)庫時則只會關閉可插拔數(shù)據(jù)庫,數(shù)據(jù)庫實例仍然會保持運行狀態(tài)鸥诽。
根據(jù) shutdown
參數(shù)的不同商玫,數(shù)據(jù)庫對于關閉數(shù)據(jù)庫實例時的處理邏輯也會不同。例如牡借,shutdown normal
和 shutdown transactional
則會等待一段時間拳昌,給予數(shù)據(jù)庫處理當前已連接的用戶的請求,直到處理結束已連接用戶的請求后進行關閉數(shù)據(jù)庫的操作钠龙。當數(shù)據(jù)庫中仍存在用戶進程時炬藤,shutdown
命令會處于阻塞狀態(tài)(有時間限制)直到用戶會話完全斷開。
倘若在執(zhí)行 shutdown
后所有的用戶請求都被阻塞了碴里,這個時候數(shù)據(jù)庫并不會關閉沈矿,而是會返回一個 ORA-01013 的錯誤。
ORA-01013: user requested cancel of current operation
以下部分為四種關閉數(shù)據(jù)庫處理的邏輯
ABORT
abort
方式為關閉數(shù)據(jù)庫最快速的方式并闲,但是關閉數(shù)據(jù)庫時并不會等待用戶進程斷開連接细睡,這個時候,盡管數(shù)據(jù)庫會拒絕新產生的用戶請求進程帝火,但數(shù)據(jù)庫中可能還存在之前已經(jīng)建立的用戶進程溜徙,或者用戶請求的事務未提交湃缎、或數(shù)據(jù)庫已提交的數(shù)據(jù)尚未寫入到存儲設備中等等情況。
這種方式關閉數(shù)據(jù)庫時蠢壹,未提交的事務并不會進行回滾嗓违,已連接到數(shù)據(jù)庫的用戶請求會被 terminated(中斷)
。并且通過 abort
方式關閉的數(shù)據(jù)庫图贸,在數(shù)據(jù)庫下一次啟動時需要做 Instance Recovery(實例恢復)
蹂季。
關閉數(shù)據(jù)庫的方式危險較大,通常使用在數(shù)據(jù)庫某些后臺進程異常退出的場景下疏日。
IMMEIDATE
immediate
方式關閉數(shù)據(jù)庫與 abort
方式類似偿洁,新的數(shù)據(jù)庫連接都不被允許,也不允許產生新的事務沟优。不同的是涕滋,shutdown immediate
方式處理關閉數(shù)據(jù)庫時,會將數(shù)據(jù)庫中未提交部分的事務進行回滾挠阁。
正因為 immediate
方式關閉數(shù)據(jù)庫時對未提交的事務進行了回滾宾肺,下一次數(shù)據(jù)庫實例啟動時不用進行實例恢復。
如果關閉數(shù)據(jù)庫時庫中有大量長事務存在侵俗,immediate
方式的關閉也不會很高锨用。
NORMAL
normal
方式時Oracle關閉數(shù)據(jù)庫的默認選項,這種方式關閉數(shù)據(jù)庫時會等待用戶會話從數(shù)據(jù)庫斷開連接后隘谣,此時數(shù)據(jù)庫不再接受新的用戶進程連接的請求增拥,且數(shù)據(jù)庫的請求會得到處理,未提交的事務會被回滾寻歧。
也因此跪者,數(shù)據(jù)庫下一次啟動時無須進行實例恢復。
這種方式屬于安全的方式熄求,但因其關閉數(shù)據(jù)庫時需要等待用戶進程斷開與數(shù)據(jù)庫的連接,因此關閉數(shù)據(jù)庫的時間相對較長逗概。
TRANSACTIONAL
transactional
方式更像是一種定時任務式的關閉弟晚,正如 transactional
意為事務型。使用這種方式關閉數(shù)據(jù)庫時逾苫,新連接到數(shù)據(jù)庫的用戶進程會被斷開卿城,對于已連接到數(shù)據(jù)庫的用戶并不會等待用戶進程完全退出,而是當數(shù)據(jù)庫中的事務被完全處理結束的時候铅搓,直接關閉數(shù)據(jù)庫瑟押,可能這個時候數(shù)據(jù)庫中仍然存在用戶未釋放的連接。
這種方式關閉數(shù)據(jù)庫星掰,可以有效防止數(shù)據(jù)庫中丟失數(shù)據(jù)多望,因為數(shù)據(jù)庫的關閉是在數(shù)據(jù)庫中的所有事務處理結束后進行的嫩舟。且無需用戶斷開與數(shù)據(jù)庫的連接。數(shù)據(jù)庫下一次啟動時也不需要進行實例恢復怀偷。
transactional local
模式則指定僅當本節(jié)點的事務處理結束后進行數(shù)據(jù)庫的關閉操作家厌,而不是等待所有的數(shù)據(jù)庫事務處理結束。