官术网_书友最值得收藏!

  • 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;
主站蜘蛛池模板: 中西区| 正阳县| 鄯善县| 本溪市| 中卫市| 玛曲县| 沅江市| 沛县| 晋州市| 施甸县| 林甸县| 洮南市| 察雅县| 安丘市| 石河子市| 奉节县| 调兵山市| 南康市| 抚松县| 双江| 连州市| 多伦县| 年辖:市辖区| 桂阳县| 专栏| 固阳县| 临清市| 都兰县| 梨树县| 闽侯县| 利川市| 日土县| 维西| 泰安市| 依安县| 建德市| 宜城市| 吉隆县| 加查县| 博罗县| 理塘县|