Oracle面試寶典-程式結構篇

chenoracle發表於2020-02-29

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" ,共同學習,共同成長!!!

Oracle面試寶典-程式結構篇

Oracle面試寶典-程式結構篇


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-2677811/,如需轉載,請註明出處,否則將追究法律責任。

相關文章