您好,登錄后才能下訂單哦!
Oracle 面試寶典 - 進程結構篇
Oracle 數據庫是以單進程還是多進程方式運行的?
在Windows 平臺下, Oracle 數據庫是以單進程 (oracle.exe) 多線程方式運行。
在Linux/Unix 平臺下, Oracle 數據庫通常是以多進程方式運行。
到了12c 這個版本, Oracle 在 Unix/Linux 平臺上做出了一些改變,引入了多線程的模式。
這個特性由threaded_execution 參數來控制,通過這個參數,可以控制數據庫以多進程方式運行或者以多線程方式運行,該參數默認是 false 。數據庫以多進程方式運行。
怎么理解進程和線程?
進程是表示資源分配的基本單位,又是調度運行的基本單位。線程是進程中執行運算的最小單位,亦即執行處理機調度的基本單位。如果把進程理解為在邏輯上操作系統所完成的任務,那么線程表示完成該任務的許多可能的子任務之一。一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。線程是操作系統可識別的最小執行和調度單位。
看到知乎上,一位名為南理漢子的作者回答特別新穎:
開個QQ ,開了一個進程;開了迅雷,開了一個進程。在 QQ 的這個進程里,傳輸文字開一個線程、傳輸語音開了一個線程、彈出對話框又開了一個線程。所以運行某個軟件,相當于開了一個進程。在這個軟件運行的過程里(在這個進程里),多個工作支撐的完成 QQ 的運行,那么這“多個工作”分別有一個線程。所以一個進程管著多個線程。通俗的講:“進程是爹媽,管著眾多的線程兒子” ...
Oracle 數據庫中有哪幾類進程?
1 客戶 進程
2 服務 進程
3 后臺進 程
請分別介紹下 客戶 進程、 服務器 進程、后臺進 程 ?
1 客戶 進程
當用戶運行一個應用程序( 如 Pro*C 程序或 SQL*Plus) 時,操作系統創建一個客戶端進程 ( 有時稱為用戶進程 ) 來運行用戶應用程序。客戶端應用程序將 和 Oracle 數據庫 相連 ,以提供與數據庫通信所需的api 。
客戶 進 程與直接與實例交互的Oracle 進 程在重要方面有所不同。
服務于客戶進程的Oracle 進程可以讀寫 SGA ,而客戶進程不能。客戶進程可以在數據庫主機之外的主機上運行,而 Oracle 進程不能。
例如,假設客戶端主機上的用戶啟動了SQL*Plus ,然后在數據庫實例沒有啟動時通過網絡連接到另一臺主機上的數據庫 sample:
SQL> CONNECT SYS@ cjc AS SYSDBA
Enter password: *********
Connected to an idle instance.
在客戶端主機上,對sqlplus 或 sample 進程的搜索只顯示 sqlplus 客戶端進程 :
在數據庫主機上,對sqlplus 或 sample 進程的搜索顯示一個具有非本地連接的服務器進程,但是沒有客戶機進程 :
2 服務 進程
Oracle 服務進程 用于處理 連接到實例的客戶進程的請求。
專用服務器進程(dedicated server ),每個進程服務一個客戶進程。
共享服務器進程(shared server ),每個進程服務多個客戶進程。
在共享服務器連接中,客戶機應用程序通過網絡連接到dispatcher 進程,而不是服務器進程。例如, 20 個客戶端進程可以連接到單個 dispatcher 進程。
dispatcher 進程接收來自連接的客戶機的請求,并將它們放入大池中的請求隊列中。第一個可用的共享服務器進程從隊列獲取請求并處理它。然后,共享服務器將結果放入 dispatcher 響應隊列。 dispatcher 進程監視此隊列并將結果傳輸到客戶機。
3 后臺進程
后臺進程執行操作數據庫所需的維護任務,并為多個用戶實現性能最大化。
每個后臺進程有一個單獨的任務,但是可以與其他進程一起工作。例如,LGWR 進程將 重做 數據從重做日志緩沖區寫入在線重做日志。當一個已填滿的重做日志文件準備歸檔時,LGWR 向另一個進程 歸檔進程 發出信號,讓它歸檔重做日志文件。
Oracle 數據庫在數據庫實例啟動時自動創建后臺進程。一個實例可以有許多后臺進程,但并不是所有后臺進程都始終存在于每個數據庫配置中。下面的查詢 會 列出數據庫上運行的后臺進程:
SELECT PNAME FROM V$PROCESS WHERE PNAME IS NOT NULL ORDER BY PNAME;
后臺進程包括三類:
3.1 強制后臺進程
3.2 可選的后臺進程
3.3 Slave 后臺進 程
強制后臺 進 程:
3.1.1 進程監控進程(PMON) 組
3.1.2 進 程管理器(PMAN)
3.1.3 監聽器注冊流程(LREG)
3.1.4 系統監控流程(SMON)
3.1.5 數據庫寫入過程(DBW)
3.1.6 日志寫入過程(LGWR)
3.1.7 檢查點過程(CKPT)
3.1.8 可管理性監控流程(MMON 和 MMNL)
3.1.9 回收器 進 程( RECO )
3.1.1 進程監 控 進程(PMON) 組
PMON 組包括 PMON 、清理主進程 (CLMN) 和清理輔助進程 (CLnn) 。這些進程負責監視和清理其他進程。
PMON 組監視緩沖區緩存的清理和客戶機進程使用的資源的釋放。例如, PMON 組負責重置活動事務表的狀態,釋放不再需要的鎖,并從活動進程列表中刪除終止進程的進程 ID 。
數據庫必須確保已終止進程持有的資源被釋放,以便其他進程可以使用它們。否則,進程可能會被阻塞或卡在爭用中。
進程監視器進程(PMON)
進程監視器(PMON) 檢測其他后臺進程的終止。如果服務器或調度程序進程非正常終止,則 PMON 組負責執行進程恢復。進程終止可能有多個原因,包括操作系統終止命令或更改系統終止會話語句。
作用:
1 、在其他進程失敗后執行清理工作:回滾事物、釋放鎖、釋放其他資源。
2 、 12C 版本之前, PMON 負責數據庫實例監聽注冊的相關任務 。
3 、檢查會話的空閑連接時間。
觸發條件: 定時被喚醒,其他進程也會主動喚醒它。
清理主進程(CLMN)
PMON 將清理工作委托給清理主進程 (CLMN) 。檢測異常終止的任務仍然由 PMON 完成。
CLMN 定期執行已終止進程、已終止的會話、事務、網絡連接、空閑會話、分離事務和已超出其空閑超時的分離網絡連接的清理。
清理輔助進程(CLnn)
CLMN 將清理工作委托給 CLnn 輔助進程。
CLnn 進程幫助清除終止的進程和會話。輔助進程的數量與要完成的清理工作量和當前清理效率成正比。
清理進程可能被阻塞,從而阻止它繼續清理其他進程。此外,如果多個進程需要清理,那么清理時間可能很長。由于這些原因,Oracle 數據庫可以并行地使用多個輔助進程來執行清理,從而緩解了緩慢的性能。
V$CLEANUP_PROCESS 和 V$DEAD_CLEANUP 視圖包含關于 CLMN 清理的元數據。 V$CLEANUP_PROCESS 視圖包含每個清理進程的一行。例如,如果 V$CLEANUP_PROCESS 。狀態繁忙,則進程當前正在進行清理。
數據庫資源隔離
如果進程或會話終止,則PMON 組將所持有的資源釋放到數據庫。在某些情況下, PMON 組可以自動隔離損壞的、不可恢復的資源,這樣就不會立即強制終止數據庫實例。
PMON 組將繼續對持有隔離資源的進程或會話執行盡可能多的清理工作。 V$QUARANTINE 視圖包含元數據,比如資源類型、消耗的內存數量、導致隔離的 Oracle 錯誤等等。
3.1.2 進程管理器(PMAN)
Process Manager (PMAN) 監視多個后臺進程,包括共享服務器、池服務器和作業隊列進程。
PMAN 監視、 啟動 和停止以下類型的進程:
1 調度程序和共享服務器進程
2 用于數據庫常駐連接池的連接代理和池服務器進程pooled server process
3 工作隊列的 進 程Job queue processes
4 可 重啟的 后臺進程
3.1.3 監聽器注冊 進 程(LREG)
12C 開始引入 LREG 進程, 負責數據庫實例監聽注冊的相關任務。 在12c 之前的版本,該部分工作由 PMON 進程負責。偵聽器注冊進程 (LREG) 向 Oracle Net 偵聽器注冊關于數據庫實例和調度程序進程的信息。當實例啟動時, LREG 輪詢偵聽器以確定它是否正在運行。如果監聽器正在運行,那么 LREG 將傳遞相關參數。如果它沒有運行,那么 LREG 會定期嘗試與它聯系。
3.1.4 系統監控 進 程(SMON)
系統監控進程(SMON) 負責各種系統級的清理任務。
分配給SMON 的職責包括 :
1 執行實例恢復,前滾(Roll Forward) 恢復到實例關閉的狀態,使用最后一次檢查點后的日志進程重做。在 Oracle RAC 數據庫中,一個數據庫實例的 SMON 進程可以對失敗的實例執行實例恢復。
2 恢復在實例恢復期間由于文 數據文件 或表空間離線錯誤而跳過的已終止事務。當表空間或文件恢復聯機時,SMON 將恢復事務。
3 清理未使用的臨時段 ,釋放空間 。例如,Oracle 數據庫在創建索引時分配區段。如果操作失敗,那么 SMON 將清理臨時空間。
4 合并空間, 在字典管理的表空間中合并連續的空閑區。
3.1.5 數據庫寫進程(DBW)
該進程負責將buffer cache 的臟數據寫入到磁盤。 DBW 進程根據 LRU 算法,將最近最少被使用的 buffer 寫入磁盤 。
盡管一個數據庫寫入進程(DBW0) 對于大多數系統來說已經足夠了,但是如果系統大量修改數據可以配置其他進程 dbw1 到 DBW9, DBWa 到 DBWz, BW36 到 bw99 來 提高寫入性能。這些附加的DBW 進程在單處理器系統上沒有用處。
DBW 進程在下列條件下將臟緩沖區寫入磁盤 :
1 當服務器進程在掃描緩沖區的閾值數目后找不到干凈的可重用緩沖區時,它向DBW 發出寫的信號。 DBW 在執行其他處理時,盡可能異步地將臟緩沖區寫入磁盤。
2 數據庫執行檢查點操作時。 DBW 定期寫緩沖區來推進檢查點,檢查點是重做線程中實例恢復開始的位置。檢查點的日志位置由緩沖區緩存中最老的臟緩沖區決定。
3 修改表空間或數據文件離線時。
4 每三秒喚醒一次查看臟塊數量,決定是否執行寫入操作。
在許多情況下,DBW 寫的塊分散在整個磁盤中。因此,寫操作往往比 LGWR 執行的順序寫操作慢。 DBW 在可能的情況下執行多塊寫操作以提高效率。在多塊寫入中寫入的塊的數量因操作系統而異。
3.1.6 日志寫 進程 (LGWR)
負責將redo log buffer 的數據寫入到在線重做日志,其會記錄所有的 DML 和 DDL 操作,用于實例 、介質 恢復。
觸發條件:
1 用戶提交事務。
2 發生在線重做日志切換。
3 LGWR 上次寫已經過去三秒鐘了。
4 重做日志緩沖區已滿三分之一,或包含1 MB 的緩沖數據。
5 DBWR 進程觸發 :DBWn 視圖將臟數據塊寫入磁盤先檢測他的相關 redo 記錄是否寫入聯機日志文件,如果沒有就通知 LGWR 進程。在 oracle 中成為提前寫機制 (write ahead):redo 記錄先于數據記錄被寫入磁盤 。
3.1.7 檢查點 進 程(CKPT)
負責更新控制文件和數據文件頭的檢查點信息,其中包括檢查點位置,SCN 號, online redo log 開始恢復的位置。檢查點在以下情況可能發起:
(1) 在日志切換 alter system switch logfile 的時候。
(2) 直接使用 alter system checkpoint 命令實現。
(3) 數據庫用 immediate 、 Transaction 、 Normal 或選項 Shutdown 數據庫的時候。
(4) 開始、結束備份表空間等 (ALTER TABLESPACE BEGIN BACKUP) 。
(5) 將表空間或者數據文件切換為只讀或者離線。
(6)DBW 進程寫的時候,但是此時只將檢查點信息寫入控制文件,而不會寫到數據文件頭。
(7) 達到 LOG_CHECKPOINT_TIMEOUT 的延遲時。
(8) 根據參數 FAST_START_MTTR_TARGT 的設置來確定。
如果當內存中產生的Dirty Buffer 所需的恢復時間 (estimated_mttr) 到達 FAST_START_MTTR_TARGET 指定時間,那么檢查點進程被觸發。
通知DBWR 進程將按檢查點隊列順序將臟數據寫入到數據文件,從而縮短了最后檢查點位置與 Redo 日志間的距離,減少實例恢復所需的時間。
3.1.8 可管理性監控 進 程(M M ON 和 MMNL )
可管理性監視進程(m m on )執行許多與自動工作負載存儲庫( AWR )相關的任務。
例如,當某個度量值違反其閾值時, m mon 會進行寫入,為最近修改的 SQL 對象獲取快照和統計值。
可管理性監視器精簡進程(MMNL )將統計信息從 SGA 中的活動會話歷史( ASH )緩沖區寫入磁盤。 MMNL 在 ASH 緩沖區已滿時寫入磁盤。
3.1.9 回收器 進 程(RECO)
RECO 是分布式事務中處理 進程 故障的 進程 .
節點的RECO 進程自動連接到其他涉及到可疑分布式事務的數據庫。當 RECO 重新建立數據庫之間的連接時,它將自動解析所有可疑事務,從每個數據庫的掛起事務表中刪除與已解析事務對應的任何行。
可選的后臺進程
可選的后臺進程是指任何沒有被定義為強制的后臺進程。
大多數可選的后臺進程都是特定于任務或特性的。例如,支持Oracle ASM 的后臺進程只有在啟用該特性時才可用。
本節介紹一些常見的可選流程:
3.2.1 歸檔 進程(ARCn)
3.2.2 作業隊列處理 進程 (CJQ0 和 Jnnn)
3.2.3 閃回歸檔 (FBDA)
3.2.4 空間管理協調程序(SMCO)
3.2.1 歸檔進 程(ARCn)
在發生重做日志切換后,歸檔進程(ARCn) 將聯機重做日志文件復制到 歸檔日志中 。
在DG 中, 這些進程還可以收集事務重做數據并將其傳輸到備用數據庫目的地。ARCn 進程僅在數據庫處于 ARCHIVELOG 模式并啟用自動歸檔時才存在。
3.2.2 作業隊列進程(CJQ0 和 Jnnn)
隊列進程運行用戶作業,通常是批處理模式。作業是計劃運行一次或多次的用戶定義任務。
例如,可以使用作業隊列在后臺調度長時間運行更新。給定一個開始日期和時間間隔,作業隊列進程嘗試在下一次出現該間隔時運行作業。
Oracle 數據庫動態管理作業隊列進程,從而允許作業隊列客戶機在需要時使用更多的作業隊列進程。當新進程空閑時,數據庫釋放它們所使用的資源。
動態作業隊列進程可以在給定的時間間隔內并發地運行許多作業。事件的順序如下:
3.2.3 閃回歸檔進 程(FBDA)
閃回數據歸檔是Oracle Database 11g 強大的新特性之一。它可以用安全有效的方式透明地跟蹤在數據庫中存儲的所有數據,并且沒有保留期限的限制。這個特性很容易配置,而且擁有高效的存儲以及性能。閃回數據歸檔不依賴于 UNDO ,通過 “AS OF” 閃回 SQL 語句來查看之前在某個時間點的數據,防止意外的數據更新和刪除 ( 例如用戶的錯誤操作 ) 或惡意的數據破壞 。
閃回數據歸檔進程,歸檔被追蹤的表的歷史行到閃回數據歸檔文件里面。當在被追蹤的表上面發生了dml 事務的時候,這個進程存儲行的前鏡像到閃回數據歸檔里面。它同樣保存當前行的元數據。
3.2.4 空間管理協調程序(SMCO)
11g 引入 extent pre-allocation 特性,由 SMCO(space management coordinator) 負責,其動態 spawn 子進程 Wnnn 用于空間分配和回收
SMCO 進程協調各種空間管理相關任務的執行。
1Extent 預分配
數據文件須開啟autoextend , SMCO 依據歷史信息,在表空間里所有尚未達到 maxsize 的數據文件間均勻的分配擴展;
2 回收臨時段
3Securefile lob 預擴展 / 回收
此特性有時會產生意料之外的結果,譬如數據文件擴展到maxsize( 但實際數據沒有這么大 )
AUTOEXTEND Grows To Full Size Without Reason [ID 1459097.1]
Why The Data Files Got Extended Up Over The Weekend [ID 1538442.1]
Slave 進 程
Slave 進程是代表其他進程執行工作的后臺進程。
本節描述Oracle 數據庫使用的一些從進程。
I / O slave 的過程
I/O slave 進程(Innn) 模擬不支持異步 I/O 的系統和設備。
在異步I/O 中,對傳輸沒有時間要求,這使得其他進程可以在傳輸完成之前啟動。
例如,假設一個應用程序向一個不支持異步I/O 的操作系統的磁盤寫入了 1000 個塊。每次寫操作都是按順序發生的,并等待寫操作成功的確認。使用異步磁盤,應用程序可以批量寫入塊并執行其他工作,同時等待已寫入所有塊的操作系統的響應。
為了模擬異步I/O ,一個進程監視多個從屬進程。 調用程序進程將工作分配給每個從屬進程,它們等待每次寫入完成并在完成后向調用程序報告。
在真正的異步I/O 中,操作系統等待 I/O 完成并向 進 程報告,而在模擬異步I/O 中,從操作系統等待并向調用者報告。
數據庫支持不同類型的I/O slave ,包括 :
? 恢復管理器 (RMAN) 的 I/O slave
在使用RMAN 備份或恢復數據時,可以對磁盤和磁帶設備使用 I/O 從設備。
?Database writer slaves
當計算機有一個CPU 時, 無法 使用多個數據庫寫進程 , 那么數據庫可以將I/O 分布在多個從進程上。 DBW 是惟一一個掃描緩沖區緩存 LRU 列表以查找要寫到磁盤上的塊的進程。但是,從 I/O 執行這些塊的 I/O 。
并行執行(PX) 服務器進程
在并行執行中,多個進程同時運行一條SQL 語句。
通過將工作分配給多個進程,Oracle 數據庫可以更快地運行語句。例如,四個流程 處理 一年 中 四個不同的季度,而不是一個流程獨自處理所有四個季度。
并行執行與串行執行形成對比,在串行執行中,單個服務器進程執行SQL 語句的順序執行所需的所有處理。例如,為了執行完整的表掃描,例如 SELECT * FROM employees ,一個服務器進程執行所有的工作 。
歡迎關注我的微信公眾號"IT 小 Chen" ,共同學習,共同成長!!!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。