1. 程式人生 > >【體系結構】Oracle程序架構

【體系結構】Oracle程序架構

## Client Process的介紹 ### Client and Server Processes `Client Process`代表著客戶端程序,每一個客戶端程序關聯著一個`Server Process`(伺服器程序)。並且客戶端程序包含著一個私有的PGA記憶體。 客戶端的程序 1. 可以通過程式碼的方式(JAVA,C或者其他語言)來和資料庫建立程序連線。 2. SQL*Plus的方式建立。 3. 通過遠端的plsqldev等客戶端工具建立連線。 舉例:用一個SQL*Plus連線資料庫,如下: ```sql 1.本地連線 [oracle@db1 ~]$ sqlplus "/as sysdba" SYS@prod> [oracle@db1 ~]$ sqlplus scott/tiger SCOTT@prod> 2.遠端主機連線 [oracle@db2 admin]$ sqlplus scott/tiger@prod SCOTT@prod> ``` 效果圖如下: ![](https://img2020.cnblogs.com/blog/1398629/202103/1398629-20210317111256828-907634661.png) 在本地主機和遠端主機,對應的每一個`client process`的建立情況如下: ```bash 1.本地的client process [root@db1 ~]# ps -ef |grep sqlplus |grep -v grep oracle 13474 13455 0 10:38 pts/3 00:00:00 rlwrap sqlplus /as sysdba oracle 13538 13503 0 10:43 pts/5 00:00:00 rlwrap sqlplus scott/tiger 2.遠端的client process [root@db2 ~]# ps -ef |grep sqlplus |grep -v grep oracle 2962 2916 0 10:45 pts/0 00:00:00 rlwrap sqlplus scott/tiger@prod ``` 在資料庫的主機下,可以檢視伺服器程序的建立情況,`(LOCAL=NO)`代表非本地連線,`(LOCAL=YES)`代表本地連線。 ```bash [root@db1 ~]# ps -ef |grep LOCAL |grep -v grep oracle 13476 13475 0 10:38 ? 00:00:00 oracleprod (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 13540 13539 0 10:43 ? 00:00:00 oracleprod (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 13590 1 0 10:46 ? 00:00:00 oracleprod (LOCAL=NO) ``` ### Connections and Sessions * 什麼是`Connections` 一個`Connection`代表著`client proces`和資料庫例項之間的一條物理連通路徑。 * 什麼是`Sessions` 一個`session`是在資料庫例項記憶體中的一個邏輯實體。代表著一個當前使用者連線資料庫的狀態。 所以,一個`connection`可以有0,1或者更多的`sessions`的建立。 Oracle的網路連線有兩種形式:`dedicated server `和`Shared server ` 下圖表示:一個session對應一個connection的情況:[一般在dedicated server模式下] ![](https://img2020.cnblogs.com/blog/1398629/202103/1398629-20210317111400165-1922718251.png) 下圖表示:兩個session在一個connection的情況:[一般在Shared server模式下] ![](https://img2020.cnblogs.com/blog/1398629/202103/1398629-20210317111500200-516177055.png) ## Server Processes的介紹 Oracle資料庫會建立`Server Process`用於處理來自於客戶端程序連線資料庫的請求。一個`client process`會對應一個獨立的`Server Process`用於和資料庫之間的通訊。 Server Processes完成如下工作: * 解析和執行SQL語句,包括建立和執行執行計劃[query plan](https://docs.oracle.com/cd/E11882_01/server.112/e40540/glossary.htm#CHDICHFA),官方文件介紹SQL執行的過程["Stages of SQL Processing"](https://docs.oracle.com/cd/E11882_01/server.112/e40540/sqllangu.htm#CHDDAGAA) * 執行PL/SQL程式碼塊 * 從`data files`中讀取資料塊,然後去修改`database buffer cache`的資料。(`DBWn`後臺程序,用於把已修改過的`blocks`寫入至磁碟) * 將結果返回給應用程式。 ### Dedicated Server Processes 專用模式下,`client process`和`server process`是一一對應的。在linux作業系統下,20個連線資料庫例項的`client processes`就會有20個`server processes`。 每一個`client process`是直接與`server process`通訊的。在會話存續期間,這個`server process`是專屬於`client process`,`server process`在PGA中儲存其特定的程序資訊和UGA。 > UGA:User global area。一個會話記憶體,儲存會話變數,例如登入資訊,同時包括OLAP池 ### Shared Server Processes 共享模式下,多個`client process`共享一個`server process`。它是通過`dispatcher process`進行排程。這種連線方式很少見,不過多討論。 ## Background Processes的介紹 一個數據庫例項有許多後臺程序,可以通過如下查詢語句,檢視資料庫正在執行的後臺程序: ```sql SELECT PNAME FROM V$PROCESS WHERE PNAME IS NOT NULL ORDER BY PNAME; ``` 作業系統的命令 ```bash [oracle@oradb ~]$ ps -ef |grep ora_ ``` ### Mandatory Background Processes 這些強制性,標誌性的程序。在最小話配置的初始化引數檔案啟動的資料庫例項中執行。 #### Process Monitor Process (PMON)系統監控 pmon是監控其他後臺程序並且檢測會話中的問題。 1.會話異常終止時,PMON 銷燬對應伺服器程序。 釋放所有當前掛起的鎖定。釋放伺服器端使用的資源(PGA 記憶體等)。回滾正在進行的未完成的事務。 2.監控其他程序,如果程序異常終止時執行程序恢復,亦或者終止資料庫例項。 3.動態註冊例項到監聽器(listener)。 #### System Monitor Process (SMON)程序監控 SMON在例項啟動時執行例項恢復`instance recovery`。具體的操作: * 線上redo日誌做前滾的修改。 * 開啟資料庫讓使用者可以訪問。 * 回滾未提交的事務。 * 合併空閒資源。 * 釋放不再使用的臨時段。 #### Database Writer Process (DBWn)資料庫寫程序 寫髒塊。將修改後的緩衝區(髒 buffer) 資料寫入資料檔案中。 `DBWn`寫入的時機: * 觸發Checkpoint * `Dirty buffers`達到了閾值 * 沒有多餘的空閒buffers。 * 超時觸發。 * RAC ping request is made * 表空間的操作`OFFLINE`,`READ ONLY`,`BEGIN BACKUP`**下線,只讀,備份** * 表的操作`DROP`,`TRUNCATE` #### Log Writer Process (LGWR)日誌寫程序 `log writer process (LGWR) `管理著redo日誌快取區,負責將日誌緩衝區中的日誌條目(**redo entries**)寫入日誌檔案。`dirty buffer(修改database buffer的髒塊) to disk`是分散寫入,`redo to disk`是快速頻繁寫入。皮面資料庫的頻繁IO操作,提升資料庫的效能。 dbwn 是`lazy write`,lgwr 是速寫,頻繁寫。 由於是`lazy write`所以dbwn有多個執行緒,而lgwr是一個執行緒。保證一個平衡 `LGWR`寫入的時機: * commit提交的時候。 * 三分之一滿(或 1M 滿)。 * 每3秒觸發一次寫入。 * dbwr 寫之前(先記後寫,先記日誌後寫髒塊,保證未提交資料都能回滾) **LGWR and Commits** Oracle資料庫使用快速提交機制 (**fast commit**) 來提高提交事務的效能。當用戶發起一個`commit`語句,事務會分配一個[system change number (SCN)](https://docs.oracle.com/cd/E11882_01/server.112/e40540/glossary.htm#CBAEHCGH)。LGWR會把commit記錄放置在redo log buffer中,同時快速寫入至磁碟。這裡麵包括**commit SCN and transaction's redo entries**. #### Checkpoint Process (CKPT)檢查點程序 **checkpoint process (CKPT)**會更新資料檔案頭部和控制檔案中的檢查點資訊。併發出一個訊號通知或督促 dbwr 寫髒塊。 檢查點資訊(Checkpoint information ) 包含 * the checkpoint position, * SCN * location in online redo log to begin recovery等等。 `CKPT`不會把data blocks寫入至資料檔案中,不會把 redo blocks寫入至redo日誌檔案中。 ![](https://img2020.cnblogs.com/blog/1398629/202103/1398629-20210317111623732-127670480.png) 完全檢查點 full checkpoint:保證資料一致性。 增量檢查點 incremental checkpoint:不斷更新控制檔案中的檢查點位置,當發生例項崩潰時,可以儘量縮短例項恢復的時間。其部分目的是避免在聯機重做日誌交換機上寫入大量塊。 區域性檢查點 tablespace/datafile checkpoint:特定的操作下,針對某個表空間的。 #### Manageability Monitor Processes (MMON and MMNL)管理監控程序 `manageability monitor process (MMON) `執行許多與自動工作負載儲存庫(AWR)相關的任務。例如,當度量值違反閾值時,MMON就會寫入,為最近修改的SQL物件獲取快照和統計值。 `manageability monitor lite process (MMNL) `將SGA中的活動會話歷史(ASH)緩衝區中的統計資訊寫入磁碟。當ASH緩衝區滿時,MMNL寫入磁碟。 #### Recoverer Process (RECO) 在分散式資料庫中,恢復程序(RECO)自動解決分散式事務中的故障。節點的RECO程序會自動連線到涉及可疑分散式事務的資料庫。當RECO在資料庫之間重新建立連線的時候,它會自動處理所有可疑的事務,從每個資料庫的掛起事務表中刪除與已解析事務對應的任何行。 ### Optional Background Processes #### Archiver Processes (ARCn) 歸檔模式下,發生日誌切換時,把當前日誌組中的內容寫入歸檔日誌,作為備份日誌。ARCn只有在資料庫開啟歸檔模式下才會啟用。 #### Job Queue Processes (CJQ0 and Jnnn) Oracle資料庫使用**job queue processes**來執行使用者作業,通常採用批處理模式。作業是計劃執行一次或多次的使用者定義任務 #### Flashback Data Archiver Process (FBDA) **flashback data archiver process (FBDA) **對被跟蹤錶的歷史修改資訊存入至閃回資料歸檔中。這個需要設定某個表有閃迴歸檔區。才有此特性。 #### Space Management Coordinator Process (SMCO) `SMCO process`協調各種空間管理相關任務的執行,如空間主動分配和空間回收。 ## 文獻參考 [Process Architecture](https://docs.oracle.com/cd/E11882_01/server.112/e40540/process.htm#C