通過寄存服務來「理解」Oracle資料庫基本體系結構和動作流程

  • 2020 年 3 月 26 日
  • 筆記

關鍵字(Keyword):資料庫(database),實例(instance),體系結構,記憶體,SQL

本文將資料庫問題診斷的基礎---資料庫的體系結構和基本動作流程,並通過寄存行李服務來幫助「理解」。

01

—

理解資料庫的體系結構

使用資料庫過程中遇到的問題可能是千奇百怪的,難以預測的,所以僅僅靠總結各種問題集合來診斷問題的話,如果遇到新問題的話,是很難解決的。 縱使它有千變萬化,我有一計定海神針。即理解理解資料庫的體系結構和基本動作流程,以不變應萬變。

實例(Instance)和物理資料庫(Database)

我們首先明確2個概念:實例(Instance)和物理資料庫(Database)。

▲Figure 1-1 Oracle Instance and Database (Database Concepts) https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/introduction-to-oracle-database.html#GUID-8F2EEEC8-0372-4419-88FF-7D77A9C0FCAD

如上圖所示,我們通常所說的資料庫其實可以分為實例(Instance)和物理資料庫(Database)2個部分。

簡單而言,實例(Instance)指後台進程/執行緒和記憶體結構,如 PMOM、SMOM、DBW、LGWR、CKPT等後台進程和伺服器進程,以及 shared pool、db buffer Cache、redo log buffer等記憶體區域。物理資料庫(Database)指存儲數據的物理文件 ,如數據文件、控制文件、重做日誌、歸檔日誌等物理文件。

單實例資料庫而言,實例(Instance)和物理資料庫(Database)的對應關係為1對1;RAC (real application cluster) 構成的情況下,實例(Instance)和物理資料庫(Database)的對應關係為1對多,即實例可以分別在不同伺服器上,而數據文件存儲在共享的磁碟陣列上,多實例可同時對物理資料庫進程操作。

寄存行李服務圖(簡化的體系結構圖)

如果將整個資料庫處理流程類比成火車站寄存行李服務的話,我們可以將資料庫體系結構簡化成如下內容(以下內容為高度抽象和概括的資訊,和實際略有不同):

1. 客戶,存行李或者取行李。 2. 前台服務員,提供服務。 3. 前台,臨時存放寄存行李。4. 後台工作人員,負責將前台行李搬運到倉庫間。 5. 倉庫,用於存放行李。

▲簡化的資料庫體系結構圖1

以上內容對應到資料庫的各部分如下:

1. 客戶端進程,即用戶的客戶端,通過發行SQL語句來實現業務的需要。2. 伺服器進程,用於接收客戶端的SQL/PL/SQL語句,進行解析和執行,訪問記憶體中的相關數據,將數據文件中的數據載入記憶體。3. 資料庫記憶體結構,用於臨時處理的數據4. 後台進程, 將記憶體中的數據保存到數據文件。5. 物理文件,用於永久的存放數據

如果進一步細化一下寄存前台的主要工作,可以包括下面3類:

1. 接待工作,  接受用戶的存取請求。2. 搬運工作,根據請求處理行李。3. 登記工作,將存取結果登記入冊

並且放在倉庫中的物品也可以細化為如下2類:

1. 行李2. 登記冊

這樣簡化的資料庫體系結構圖變成如下:

▲簡化的資料庫體系結構圖2

相對應地,資料庫記憶體的主要區域的相關工作包括下面內容:

1. 共享池(shared pool),用於處理快取SQL游標,SQL語句解析,執行等工作2. 資料庫緩衝區(Database buffer cache),用於處理從數據文件中讀取的數據塊,更改數據塊等工作,主要關聯進程為DBW,伺服器進程3. 日誌緩衝區(redo log buffer),用於記錄 DML和DDL操作對數據塊的更改,主要關聯進程為LGWR

物理文件主要包括控制文件,數據文件,日誌文件。

02

寄存行李服務(資料庫基本動作)流程

由此,寄存行李服務(客戶操作資料庫)可以分下如下幾類:

取行李(查詢數據)的過程:

1. 客戶發出取行李請求。(客戶端發行SQL)2. 前台服務員,接受用戶的取行李請求。(解析和執行SQL)3. 根據請求開始處理行李,如果前台有相應的行李話,直接提供給客戶;(buffer cache中有相應數據塊,直接返回查詢結果給客戶端)4. 如果前台沒有的話,前台人員去倉庫搬運來。(buffer cache中沒有相應數據塊,伺服器進程讀取數據文件)5. 前台人員,根據情況從倉庫搬運行李。(伺服器從數據文件讀取相應數據塊)6. 前台提供給客戶行李。(返回查詢結果給客戶端)
存行李(插入數據)的過程:
1. 客戶發出存行李請求。(客戶端發行SQL)2. 前台服務員,接受用戶的存行李請求。(解析和執行SQL)3. 根據請求開始處理行李,將行李打包或貼上標籤(buffer cache中取得空塊,修改數據塊)4. 登記資訊入冊(在 Log Buffer中寫Redo資訊)5. 請後台人員將行李搬入倉庫。(DBW將相應數據塊寫入數據文件)6. 前台將存行李結果回饋給客戶。(返回Insert結果給客戶端)7. 後台人員非同期將登記冊搬入倉庫。(LGWR非同期將Redo資訊寫入更新日誌,伺服器進程無需等待)

替換行李中的物品(更新數據)的過程:

1. 客戶發出替換行李中的物品請求。(客戶端發行SQL)2. 前台服務員,接受用戶的替換請求。(解析和執行SQL)3. 根據請求開始處理行李,如果相應的行李還在前台的話,替換物品。(buffer cache中有相應數據塊,修改數據塊)4. 如果行李沒在前台的話,前台從倉庫搬運來。(buffer cache中沒有相應數據塊,伺服器進程讀取數據文件)5. 前台人員,根據情況從倉庫搬運行李。(伺服器進程從數據文件讀取相應數據塊)6. 在前台替換物品。(buffer cache中修改數據塊)7. 登記資訊入冊(在 Log Buffer中寫Redo資訊)8. 前台將替換結果回饋給客戶。(返回Update結果給客戶端)9. 後台人員非同期將登記冊搬入倉庫。(LGWR非同期將Redo資訊寫入更新日誌,伺服器進程無需等待)

客戶簽字確認(Commit)的過程:

1. 客戶同意簽字確認。(客戶端發行Commit)2. 前台服務員,接受用戶的請求。(解析和執行SQL)3. 前台服務員提供登記冊給用戶簽字後,前台等待後台回饋。(在 Log Buffer中寫Redo資訊,伺服器進程等待)4. 後台人員將登記冊搬入倉庫。(LGWR將Redo資訊寫入更新日誌)5. 前台接收到後台回饋, 將結果回饋給客戶。(返回Commit結果)

本文主要介紹了資料庫的基本體系結構和動作流程,並通過寄存行李服務來幫助「理解」,希望對你有所幫助。

※本文主要對前一篇中關於伺服器進程和DBWR進程的動作進行了修正

※特別感謝峰哥的指正

專註於技術不限於技術!

用碎片化的時間,一點一滴地提高資料庫技術和個人能力。

Tags: