Oracle架構實現原理 --轉載

參考:Oracle架構實現原理、含五大進程解析(圖文詳解)

一.Oracle RDBMS架構圖

Oracle RDBMS架構圖

Oracle指的是Oracle RDBMS(Relational databases Management system),一套Oracle數據庫管理系統,也稱之為Oracle Server。而Oracle Server主要有兩大部分:

Oracle Server = 實例 + 數據庫 (Instance和Database是相互獨立的)

  • 數據庫 = 數據文件 + 控制文件 +日志文件
  • 實例 = 內存池 + 后臺進程

所以可以細分為: Oracle Server = 內存池 + 后臺進程 + 數據文件 + 控制文件 + 日志文件

一臺Oracle Server支持創建多個Database,而且每個Datacase是互相隔離而獨立的。不同的Database擁有屬于自己的全套相關文件,例如:有各自的密碼文件,參數文件,數據文件,控制文件和日志文件。
Database由一些物理文件(如:存放在存儲設備中的二維表文件)組成。二維表存儲在Database中,但Database的內容不能被用戶直接讀取,用戶必須通過Oracle instance才能夠訪問Database,一個Instance只能連接一個Database,但是一個Database可以被多個Instance連接。
將上面的Oracle RDBMS架構圖進行抽象分類,可以將Oracle架構抽象為:Oracle體系 = 內存結構 + 進程結構 + 存儲結構

Oracle組成分布

二.內存結構

Oracle Instance是Oracle RDBMS的核心之一,負責RDBMS的管理功能。Oracle Instance主要由內存池SGA和后臺進程組成。

系統全局區SGA

系統全局區分布

SGA(System Global Area)是與Oracle性能關系最大的核心部分,也是對Oracle進行調優的主要考量。SGA內存池會在Instance啟動時被分配,在Instance關閉時被釋放。在一定范圍內,SGA可以在Instance運行時通過自動方式響應DBA的指令。

1.高速緩存緩沖區(數據庫緩沖區)

數據庫緩沖區是oracle執行SQL語句的區域。
例如在更新數據時,用戶執行的SQL語句不會直接對磁盤上的數據文件進行更改操作,而是首先將數據文件復制到數據庫緩沖區緩存(就是說數據庫緩沖區里會存放著SQL相關數據文件副本),再更改應用于數據庫緩沖區緩存中這些數據塊的副本。而且數據塊副本將在緩存中保留一段時間,直至其占用的緩沖區被另一個數據庫覆蓋為止(緩沖區Size有限)。
在查詢數據時,為了提高執行效率,查詢的數據也要經過緩存。建立的Session會計算出那些數據塊包含關鍵的行,并將它們復制到數據庫緩沖區中進行緩存。此后,相關關鍵行會傳輸到Session的PGA作進一步處理。這些數據塊也會在數據庫緩存區緩存中保留一段時間。
一般情況下,被頻繁訪問的數據塊會存在于數據庫緩沖區緩存中,從而最大程度地減少對磁盤I/O的需要。

那什么時候會將被更新的數據塊副本寫入到磁盤中的數據文件呢?

答案就是:如果在緩沖區緩存中存儲的數據塊與磁盤上的數據塊不同時,那么這樣的緩沖區常稱為”臟緩沖區”,臟緩沖區中的數據塊副本就必須寫回到磁盤的數據文件中。

調優:數據庫緩沖區緩存的大小會對性能產生至關重要的影響,具體需要多大的Size才能成為最佳配比還要結合實際的生產環境而言。總體而言可以依據以下兩點基本要求來判斷:

  1. 緩存應足夠大,以便能緩存所有被頻繁訪問的數據塊。如果緩存過小,那么將導致磁盤I/0活動過多,因為頻繁訪問的數據塊持續從磁盤讀取,并由其他數據塊使用和重寫,然后再從磁盤讀取。
  2. 但也不能太大,以至于它會將極少被訪問的塊也一并加入到緩存中,這樣會增長在緩存中搜索的時間。

數據庫緩沖區緩存在Instance啟動時被分配。從數據庫9i開始,可以隨時將其調大或調小。可以采用手動方式重調,也可以根據工作負荷自動重調大小(事務)。

2.日志緩沖區

日志緩沖區是小型的、用于短期存儲將寫入到磁盤上的重做日志的變更向量的臨時區域。主要作用是提供更加快的日志處理效率。

3.共享池

共享池的大小也對性能產生重要影響

  1. 它應該足夠大,以便緩存所有頻繁執行的代碼和頻繁訪問的對象定義。如果共享池過小,則性能下降,因為服務器會話將反復搶奪其中的空間來分析語句,此后,這些語句會被其他語句重寫,在重新執行時,將不得不再次分析。如果共享池小于最優容量,則性能將下降。但有一個最小容量,如果低于此限度,則語句將失敗。
  2. 但也不能過大,以至于連僅執行一次的語句也要緩存。過大的共享池也會對性能產生不良影響,因為搜索需要的時間過長。

確定最優容量是一個性能調整問題,大多數數據庫都需要一個數百MB的共享池。有些應用程序需要1GB以上的共享池,但很少有應用程序能夠在共享池小于100MB時充分運行。

4.大型池

主要用途是供共享的服務器進程使用。

5.JAVA池

只有當應用程序需要在數據庫中運行java存儲程序時,才需要java池。

三.進程結構

進程結構

1.用戶進程

用戶連接進程是連接用戶和Oracle Instance的橋梁。只有在User與Instance建立了連接以后,User才能夠對Oracle Server進行操作。
用戶連接進程 = 用戶進程 + 服務進程 + PGA

A.用戶進程User Process

當一個Database User請求連接到Oracle Server時,Oracle Server會創建User Process。

User Process的作用:

為Database User與Server Process建立連接 并不會直接與Oracle Server交互
connect連接:是User和Server Process之間的通信通道。

服務器進程和用戶進程

B.Server Process服務進程

用于處理Database User和Oracle Server之間的連接。
當一個User與User Process建立了一個connect后,Oracle Server會創建一個Server Process。然后再由User Process與Server Process建立了連接之后,Server Process會通過用戶提交的請求信息來確定與oracle instance建立一個會話。

Server Process的作用:

與Oracle Server直接交互 復制執行和返回結果

C.Session會話

一個用戶通過User Process(本質是通過Server Process)與Oracle Instance建立連接后稱之為一個會話,一個用戶可以建立多個會話,即同時使用同一個用戶可以多次的連接到同一個實例,也就是說多個session可以使用同一個connect。

會話

2.程序全局區PGA

程序全局區

PGA:Oracle Server Process分配來專門用于當前User Session的內存區。該區域是私有的,不同的用戶擁有不同的PGA。

PGA包含了Server Process數據和控制信息的內存區域。,由下列3個部分組成:

  1. 棧空間:存儲Session的變量、數組等的內存空間。
  2. Session Info:如果運行的不是多線程服務器,會話信息將保存在PGA中,如果是多線程服務器,則保存在SGA中。
  3. 私有SQL區:用來保存綁定變量(binding variables)和運行時緩沖區(runtime buffers)等信息。

Oracle的connect連接和session會話與User Process緊密相關

注意:在RDBMS中由db_name和instance_name共同確定一個Database,所以Instance_name被用于Oracle與OS之間的聯系同時也被用于Oracle Server與外部連接時使用。

所以在User提交連接請求的時候,User Process首先會與Server Process建立Connect,然后Server Process會通過請求中所包含的db_name和Instance_name來確定需要且可以被連接的數據庫(RDBMS可以存在多個數據庫),這樣就確保了RDBMS在擁有多個數據庫的情況下,還能夠保證每一個Database的獨立性。而且同一個Database可以被多個屬于這個Databse的不同用戶發起的Instance連接。這一個功能是非常有必要的,因為每一個不同的數據庫中都包含有同名的sys、system等系統用戶。

四.后臺進程

后臺進程主要是完成數據庫管理任務 ,后臺進程是Oracle Instance和Oracle Database的聯系紐帶,分為核心進程和非核心進程。

1. 核心進程:核心進程,必須存在,有一個終止,所有數據庫進程全部終止,實例崩潰!其中五大進程全都是核心進程。
2. 非核心進程:完成數據庫的額外功能,非核心進程死亡數據庫不會崩潰!

常用的核心進程:

常用的核心進程

在用戶訪問數據庫時,首先會提交請求,再分配SGA內存,創建并啟動后臺進程和實例,最后建立連接和會話。Oracle Server運行過程中必須啟動上面的前五個進程。否則實例無法創建。

A.數據庫寫入進程(DBWn)

數據庫寫入進程

Server process連接Oracle后,通過數據庫寫進程(DBWn)將數據緩沖區中的“臟緩沖區”的數據塊寫入到存儲結構(數據文件、磁盤文件)
Database writer (DBWn)數據庫寫進程:
只做一件事,將數據寫到磁盤。就是將數據庫的變化寫入到數據文件。
該進程最多20 個,即使你有36 個CPU 也只能最多有20 個數據庫寫進程。
進程名稱DBW0-DBW9 DBWa-DBWj

注意:數據庫寫進程越多,寫數據的效率越高。該進程的個數應該和cpu的個數對應,如果設置的數據庫寫進程數大于CPU 的個數也不會有太明顯的效果,因為CPU 是分時的。

B.檢查點(CKPT)

檢查點

Checkpoint (CKPT)檢查點進程:

主要用戶更新數據文件頭,更新控制文件和觸發DBWn數據庫寫進程。
Ckpt 進程會降低數據庫性能,但是提高數據庫崩潰時,自我恢復的性能。我們可以理解為階段性的保存數據,一定的條件滿足就觸發,執行DBWn存盤操作。

C.進程監視進程(PMON)

進程監視進程

PMON在后臺進程執行失敗后負責清理數據庫緩存和閑置資源,是Oracle的自動維護機制。
清除死進程 重新啟動部分進程(如調度進程) 監聽的自動注冊 回滾事務 釋放鎖 釋放其他資

D.系統監視進程(SMON)

系統監視進程

SMON啟動后會自動的用于在實例崩潰時進行數據庫實例自動恢復。
清除作廢的排序臨時段,回收整理碎片,合并空閑空間,釋放臨時段,維護閃回的時間點。
在老數據庫版本中,當我們大量刪除表的時候,會觀測到SMON進程很忙,直到把所有的碎片空間都整理完畢。

E.重做日志文件和日志寫入進程

重做日志文件和日志寫入進程

主要用于記錄數據庫的改變和記錄數據庫被改變之前的原始狀態,所以應當對其作多重備份,用于恢復和排錯。
激活LGWR的情況:
提交指令 日志緩沖區超過1/3 每三秒 每次DBWn執行之前

F.歸檔進程(ARCn)

歸檔進程

五.存儲結構

Oracle RDBMS存儲結構主要由Database組成。
又能夠將Database分為物理結構和邏輯結構來理解。


存儲結構

1.物理結構

Database物理結構:是Database在操作系統中的文件集合,即:磁盤上的物理文件,主要由數據文件、控制文件、重做日志文件、歸檔日志文件、參數文件、口令文件組成。

A.Data Files

  • 數據文件是數據的存儲倉庫。
  • 包括所有的數據庫數據
  • 只能屬于一個數據庫
  • 來自于被稱為”表空間”的數據庫存儲邏輯單元
  • 可以直接被讀進內存,在執行SQL語句的時候,會將相關的數據文件副本加載如數據緩沖區。
  • 通過備份策略可以使數據文件得到保護

B.Redo Log Files

重做日志文件包含對數據庫所做的更改操作記錄,在Oracle發生故障時能夠恢復數據。

能夠恢復數據的原理:重做日志文件會按時間的順序,將應用于數據庫的一連串的變更向量(做了什么操作)存儲起來(即將變更的地方標記起來)。其中包含了所有已經完成操作的信息和完成操作之前的數據庫狀態。如果數據文件受損,就可以將這些變更向量應用于數據文件備份來進行重做(重建)工作,將它恢復到發生故障的那一刻前的狀態。重做日志文件又分為下面兩種類型:

聯機重做日志文件:記錄連續的數據庫操作 歸檔日志文件Archived Log Files:用于時間點恢復,當RedoLogFiles存滿時,會對這些日志進行歸檔備份,以便以后還原數據時使用。

C.Control Files

控制文件包含維護和驗證數據庫完整性的必要的信息。

它記錄了聯機重做日志文件、數據文件的位置、更新的歸檔日志文件的位置。它還存儲著維護數據庫完整性所需的信息,如數據庫名。控制文件是以二進制型式存儲的,用戶無法修改控制文件的內容。控制文件不過數MB,卻起著至關重要的作用。

D.Parameter File

實例參數文件,當啟動oracle實例時,SGA結構會根據此參數文件的設置內存,后臺進程會據此啟動。

E.Password File

用戶通過提交username/password來建立會話,Oracle根據存儲在數據字典的用戶定義對用戶名和口令進行驗證。

2.邏輯結構

表空間就是典型的Oracle邏輯結構類型 —— 里面存放著若干的數據文件

表空間:用于存儲數據庫對象的邏輯空間,表空間是在數據庫中開辟的一個空間,用于存放數據庫的對象,它是信息存儲的最大邏輯單位,是存放數據庫文件的地方,其中數據又被存放在表空間中的數據文件中。一個數據庫可以由多個表空間組成,Oracle的調優就是通過表空間來實現的。(Oracle數據庫獨特的高級應用)

表空間的作用:分類管理、批量處理; 將瑣碎的磁盤文件整合、抽象處理成為邏輯結構。這樣更加便于我們去管理數據庫。

邏輯空間到物理空間的映射


段、區和塊

六.簡述Oracle運行過程

這里寫圖片描述
這里寫圖片描述
  • User訪問Oracle Server之前提交一個請求(包含了db_name、instance_name、username、password等信息),Oracle Server接收到請求并通過Password File的驗證后,分配SGA內存池,啟動后臺進程同時創建并啟動實例。
  • 在啟動實例之后User Process與Server Process建立Connect。
  • 再通過Server process和Oracle Instance完成建立Sesscion。
  • 用戶執行SQL語句,由server process接收到并直接與Oracle交互。
  • SQL語句通過Server Process到達Oracle Instance,再將SQL載入數據庫緩沖區。
  • Server Process通知Oracle Database將與SQL語句相關的數據塊副本加載到緩沖區中。
  • 在數據庫緩存區執行SQL語句,并產生”臟緩沖區”。
  • 由CKPT檢查點進程檢查到”臟緩沖區”,并調用DBWn數據庫寫進程,但在DBWn執行之前,應該由LGWR先將數據文件的原始狀態、數據庫的改變等信息記錄到Redo Log Files。
  • 將更新的內容寫入到磁盤中的數據文件。 返回結果給用戶
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容