1. 程式人生 > >Oracle啟動數據庫過程中實例與線程思考

Oracle啟動數據庫過程中實例與線程思考

線程進程 oracle 基礎 操作系統 數據庫

早期用Linux的時候,看Oracle監聽狀態和端口只是瀏覽一下,沒有認真看過內容也是英文提示,時隔數載重新撿起Oracle,Windos下CMD查看監聽狀態發現很多有意思的問題,Oracle實例和線程很多不懂之處請高手指點


首先Oracle啟動階段nomount,mount,open(其余不作啰嗦)每一個階段都做了測試和總結

1、數據庫關閉階段(實例狀態)

服務 "CLRExtProc" 包含 1 個實例。

實例 "CLRExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程序.

已連接到空閑例程。

登錄之後已連接空閑進程,而且狀態未知的,後期查閱資料才知道UNKNOWN狀態非自動註冊,通過搜索Listener.org裏面內容,匹配services之後才進行的註冊,在這個文件中不需要配置SID,PMON會自動檢測,因為數據庫沒有啟動,所以空閑進程。

2、nomount階段

SQL> startup nomount;

ORACLE 例程已經啟動。

Total System Global Area 1686925312 bytes

Fixed Size 2176368 bytes

Variable Size 1090521744 bytes

Database Buffers 587202560 bytes

Redo Buffers 7024640 bytes


可見數據庫大小,變量緩沖區等資源已經啟動。我們測試查詢一下v$datafile,v$controlfile,v$database.


SQL> select file#,name from v$datafile;

select file#,name from v$datafile

*

第 1 行出現錯誤:ORA-01507: ??????

SQL> select name from v$controlfile;

未選定行


查詢看到nomount階段沒有加載數據文件,可以檢測SGA相關。

監聽狀態查看(實例)

服務 "soujiusubdb" 包含 1 個實例。

實例 "soujiusubdb", 狀態 BLOCKED, 包含此服務的 1 個處理程序...


引用:這時候實例已經啟動,BLOCKED阻塞的狀態,那麽Oracle實例應該是操作系統中線程運行,OS阻塞用pritive調用原子操作,由於某事件無法運行,受阻塞。但是nomount階段多數講解:只會創建實例,並不加載數據庫,Oracle僅為實例創建各種內存結構和服務進程,不會打開任何數據文件。在NoMount模式下,只能訪問那些與SGA區相關的數據字典視圖,包括V$PARAMETER、V$SGA、V$PROCESS 和 V$SESSION等,這些視圖中的信息都是從SGA區中獲取的,與數據庫無關,系統分配內存、開啟後臺進程,同時更新alter日誌文件。


那麽在操作系統的層面是否能這樣理解,通過Oracle的nomount命令來創建實例,這時候操作系統會給分配進程或線程去響應請求,Oracle為實例創建內存結構和服務進程,也就是實例具備了必要資源分配,那麽此時的線程的狀態應該為就緒狀態(除了得到CUP之外的資源,獲得處理機即可運行),插入就緒隊列,但是監聽狀態為阻塞,也就意味著nomount狀態下,實例線程在就緒隊列被掛起,不釋放CUP(實例當前應該沒有獲取CPU),調用suspend原子操作,靜止就緒(不接受調度)nomount是主動而非被動去阻塞。


3、mount階段

我們這時候去查看數據文件,日誌文件,控制文件都是正常,查看監聽實例,這時候實例狀態變成了Ready(就緒狀態),也就是Oracle在執行mount時候時候調用原語active來喚醒實例線程,變成活動就緒狀態。

服務 "CLRExtProc" 包含 1 個實例。

實例 "CLRExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程序...

服務 "soujiusubdb" 包含 1 個實例。

實例 "soujiusubdb", 狀態 READY, 包含此服務的 1 個處理程序...


引用這種啟動模式將為實例加載數據庫,但保持數據庫為關閉狀態。因為加載數據庫時需要打開數據庫控制文件,但數據文件和重做日誌文件都都無法進行讀寫,所以用戶還無法對數據庫進行操作。 在Mount模式下,只能訪問那些與控制文件相關的數據字典視圖,包括V$THREAD、V$CONTROLFILE、V$DATABASE、V$DATAFILE 和 V$LOGFILE等,這些視圖都是從控制文件中獲取的。 啟動條件是需要有控制文件,如果控制文件丟失或者損壞,啟動將會報錯。此時系統會打開控制文件、檢查數據文件、日誌文件的名稱和位置,但此時不檢查文件到底是否存在不存在。


4、open階段

引用:open階段,該階段主要是打開數據文件、日誌文件,在打開的過程中對數據文件和日誌文件進行一致性檢查,如果不一致,則SMON進程繼續實例恢復,如果文件丟失,打開失敗。

我本以為在此階段實例狀態會就緒變成執行狀態,變更open階段之後,查看監聽後發現多出一個服務,但是實例名一樣,狀態也一樣,仍然為就緒狀態,Oracle實例線程一直處於就緒狀態這一點還沒有搞清楚,希望老師們給予解答,解析迷惑。

服務摘要..

服務 "CLRExtProc" 包含 1 個實例。

實例 "CLRExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程序...

服務 "SOUJIUSUBDBXDB" 包含 1 個實例。

實例 "soujiusubdb", 狀態 READY, 包含此服務的 1 個處理程序...

服務 "soujiusubdb" 包含 1 個實例。

實例 "soujiusubdb", 狀態 READY, 包含此服務的 1 個處理程序...


數據庫關閉,卸載實例,終止實例,幾種參數關閉方式需求不同,應用場合不同,但是最後整體一個關閉過程大同小異,希望也能學習到關於關閉數據庫時候線程的動作。





Oracle啟動數據庫過程中實例與線程思考