【體系結構】Oracle程序架構
阿新 • • 發佈:2021-03-17
## 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