- Oracle DBA基礎教程
- 林樹澤
- 3066字
- 2021-03-26 13:21:39
2.6 Oracle數據庫后臺進程
后臺進程是在實例啟動時,在數據庫服務器端啟動的管理程序,它使得數據庫的內存結構和數據庫物理結構之間協調工作。從功能上考慮,數據庫物理結構、數據庫內存結構和后臺進程之間的關系如圖2-8所示。

圖2-8 內存結構、后臺進程和物理結構的關系圖
數據庫有五個后臺進程是必須啟動的,否則數據庫實例無法啟動成功。它們分別是:DBWR、LGWR、PMON、SMON、ARCH和CKPT。本節將主要講解這6個后臺進程,它們也是數據庫服務器中最重要的幾個后臺進程。
2.6.1 系統監控進程(SMON)
系統監控進程的主要作用是數據庫實例恢復。當數據庫發生故障時,如操作系統重啟,此時實例SGA中所有沒有寫到磁盤的信息都將丟失。當數據庫重新啟動后,系統監控進程將自動恢復實例。實例恢復包括如下三個步驟。
01 前滾所有沒有寫入數據文件而被記錄在重做日志文件中的數據。此時,系統監控進程讀取重做日志文件,把用戶更改的數據重新寫入數據塊。
02 打開數據庫,此時或許系統監控進程的前滾操作還沒有完成,Oracle這樣做的目的就是方便用戶及時登錄,以免前滾時間太長,影響用戶的行為,這樣用戶就可以操作那些沒有被事務恢復鎖住的數據。
03 回滾未提交的事物。
除此之外,系統監控進程執行某些空間維護的作用。如Combine、coalesces、adjacent 數據文件中的自由空間和回收數據文件中的臨時段。
2.6.2 進程監控進程(PMON)
進程監控負責服務器進程的管理和維護工作,在進程失敗或連接發生異常時該進程負責一些清理工作。
01 回滾沒有提交的事務。
02 釋放所持有的當前的表或行鎖。
03 釋放進程占用的SGA資源。
04 監視其他Oracle的后臺進程,在必要時重啟這些后臺進程。
05 向OracleTNS監聽器注冊剛啟動的實例。如果監聽器在運行,就與這個監聽器通信并傳遞如服務名和實例的負載等參數,如果監聽器沒有啟動,進程監控(PMON)會定期嘗試連接監聽器來注冊實例。
2.6.3 數據庫寫進程(DBWR)
在介紹高速緩沖區時,提到了臟數據的概念,臟數據就是用戶更改了的但沒有提交到數據庫中的數據,因為在數據庫中的數據文件與數據庫高速緩存中的數據不一致,所以被稱為臟數據,這種臟數據必須在特定的條件下寫到數據文件中,這就是數據庫寫進程的作用。
數據庫寫進程負責把數據庫高速緩沖區中的臟數據寫到數據文件中。或許讀者會問,為什么不立即提交臟數據呢,這樣就不需要復雜的數據庫寫進程來管理了。其實,Oracle這樣設計的思路很簡單,就是減少I/O次數,當臟數據量達到一定程度或者滿足某種其他條件時,就提交一次臟數據。因為磁盤的輸入、輸出會花費系統時間,使得Oracle系統的效率降低。
圖2-9是數據庫寫進程涉及的數據庫組件,通過該圖可以清晰理解數據庫寫進程工作中涉及的“實體”。

圖2-9 數據庫寫進程“實體”關系
當以下事件發生時,會觸發數據庫寫進程把臟數據寫到數據庫的數據文件中。
● 發生檢查點事件。
● 臟數據量達到了門限值。
● 數據庫緩沖區沒有足夠的緩存為其他事務提供足夠的空間。
● 表空間處于熱備份狀態。
● 表空間被置為離線狀態。
● 表空間被置為只讀狀態。
● 刪除表或者截斷表。
● 超時。
注意
數據庫寫進程的性能顯然很重要,如果它寫臟數據到數據文件的速度很慢,使得大量緩沖區無法釋放,就會出現一些等待事件,如Free Buffer Waits等。實際在Oracle數據庫上,一個數據庫實例可以啟動多個數據庫寫進程,在多CPU系統可以使用多個數據庫寫進程來分擔單個寫進程的工作負載。
2.6.4 重做日志寫進程(LGWR)
重做日志寫進程負責將重做日志緩沖區中的數據寫到重做日志文件。此時重做日志緩沖區中的內容是恢復事務所需要的信息,比如用戶使用UPDATE語句更新了某行數據,恢復事務所需的信息就是更新前的數據和更新后的數據,這些信息用于該事務的恢復。
重做日志寫進程在滿足以下條件時,會啟動進程工作。
①當事務提交時。
②當重做日志緩沖區的1/3被占用時。
③當重做日志緩沖區中有1MB的數據時。
④當數據庫寫進程把臟數據寫到數據文件之前。
⑤每3秒鐘。
圖2-10是重做日志寫進程工作示例圖。

圖2-10 數據庫重做日志寫進程
注意
從圖2-10可以看出,日志寫進程會通知數據庫寫進程將臟數據寫到數據文件,但是數據庫寫進程不會把臟數據寫到在線重做日志,也不會通知日志寫進程做任何事情。
數據庫寫進程是離散寫到不同的數據庫文件上的,在執行一個更新時,數據庫寫進程會修改不同空間中存儲的數據塊和索引塊,所以數據庫寫進程的離散寫的速度很慢。而重做日志寫進程是順序寫,它比離散寫的效率要高,把每個事務的重做信息全部放在重做日志中,通過在數據庫高速緩存中緩存臟數據塊,而由重做日志寫進程完成大規模順序寫,從整體上可以提高系統的性能。
2.6.5 歸檔日志進程(ARCH)
歸檔日志進程是可選進程,該進程并不在實例中啟動,而是自動啟動。它的作用是把寫滿的重做日志文件的數據寫到一個歸檔日志中,這個歸檔日志用做介質故障時的數據庫恢復。圖2-11是歸檔日志進程涉及的實體關系,即歸檔日志和重做日志之間的關系。

圖2-11 歸檔日志進程
重做日志文件負責實例失敗時的數據恢復,因為SGA中沒有被保存的數據會全部丟失,這樣使用重做日志文件就可以完全恢復事務。而歸檔日志進程用于介質恢復,比如磁盤損壞時,可以使用以前備份的數據文件,利用歸檔日志和重做日志就可以完全恢復數據庫。
歸檔進程不是實例啟動時自動啟動,在生產數據庫中必須使用歸檔模式,以防止災難性的數據損壞。可以使用例子2-19查看系統的歸檔模式。
例子2-19 查看系統的歸檔模式
SQL> connect system/Oracle@orcl as sysdba; 已連接。 SQL> archive log list; 數據庫日志模式 非存檔模式 自動存檔 禁用 存檔終點 USE_DB_RECOVERY_FILE_DEST 最早的聯機日志序列 3 當前日志序列 5
例子2-19說明當前的數據庫處于非歸檔模式,沒有啟動歸檔進程,歸檔文件存儲在USE_DB_RECOVERY_FILE_DEST參數指定的目錄下。那么,如何設置數據庫為歸檔模式呢?
可以使用例子2-20設置數據庫為歸檔模式,并且啟用自動歸檔,但前提是必須首先關閉數據庫,以mount參數啟動數據庫,更改后再啟動到open狀態即可。下面演示這個過程,注意這里的遷移是已經關閉了數據庫。
例子2-20 設置數據庫為歸檔模式的過程
SQL> shutdown immediate 數據庫已經關閉。 已經卸載數據庫。 Oracle 例程已經關閉。 SQL> startup mount; ORA-12514: TNS: 監聽程序當前無法識別連接描述符中請求的服務 SQL> connect /as sysdba; 已連接到空閑例程。 SQL> startup mount; Oracle 例程已經啟動。 Total System Global Area 535662592 bytes Fixed Size 1334380 bytes Variable Size 260047764 bytes Database Buffers 268435456 bytes Redo Buffers 5844992 bytes 數據庫裝載完畢。 SQL> alter database archivelog; 數據庫已更改。 SQL> alter database open; 數據庫已更改。
再使用例子2-21查詢更改結果。
例子2-21 查詢當前數據庫的歸檔模式
SQL> archive log list; 數據庫日志模式 存檔模式 自動存檔 啟用 存檔終點 USE_DB_RECOVERY_FILE_DEST 最早的聯機日志序列 7 下一個存檔日志序列 9 當前日志序列 9
在例子2-21中,數據庫的日志模式改為存檔模式,自動存檔已經啟動,歸檔日志的存儲目錄即存檔終點是數據庫恢復文件目錄。
我們可以通過下例查詢參數DB_RECOVERY_FILE_DEST的位置。
例子2-22 查看數據庫恢復目錄的位置
SQL> show parameter db_recovery_file_dest; NAME TYPE VALUE --------------------------------------------------------- ------------------ ------------------------------ db_recovery_file_dest string F:\app\Administrator\flash_rec overy_area db_recovery_file_dest_size big integer 2G
參數db_recovery_file_dest的value值為F:\app\Administrator\flash_recovery_area,說明了數據庫恢復文件目錄的位置,而參數db_recovery_file_dest_size的value值為2G,說明該存儲目錄分配的磁盤空間大小。
2.6.6 校驗點進程(CKPT)
首先介紹檢驗點,檢驗點是一個事件,當數據庫寫進程把SGA中所有被修改了的數據庫高速緩存中的數據寫到數據文件上時產生,這些被修改的數據包括已提交的和未提交的數據。由于引入了校驗點,使得所有校驗點的所有變化了的數據都寫到數據文件中,在實例恢復時,就不必恢復校驗點之前的重做日志中的數據,加快了系統恢復的效率。
校驗點進程并不是用于建立校驗點,只是在校驗點發生時,會觸發這個進程進行一系列工作。包括如下兩點。
①校驗點進程要將校驗點號碼寫入相關的數據文件的文件頭中。
②校驗點進程把校驗點號碼、SCN號、重做日志序列號、歸檔日志名字等都寫入控制文件。
圖2-12是數據庫校驗點進程的工作示意圖。

圖2-12 數據庫校驗點進程
Oracle提供一個指令,用戶可以強制產生校驗點,使得用戶可以干預校驗點的產生,如下例所示。
例子2-23 強制執行校驗點
SQL> alter system checkpoint;
- The Android Game Developer's Handbook
- PHP+MySQL網站開發技術項目式教程(第2版)
- Building Mapping Applications with QGIS
- Internet of Things with Intel Galileo
- 零基礎輕松學SQL Server 2016
- Visual C#.NET程序設計
- Cocos2d-x學習筆記:完全掌握Lua API與游戲項目開發 (未來書庫)
- Instant Ext.NET Application Development
- 深入實踐Kotlin元編程
- ASP.NET Web API Security Essentials
- Qt 4開發實踐
- Learning Kotlin by building Android Applications
- C語言程序設計教程
- jBPM6 Developer Guide
- Learning Rust