Oracle架構(gòu)實現(xiàn)原理 --轉(zhuǎn)載

參考:Oracle架構(gòu)實現(xiàn)原理、含五大進程解析(圖文詳解)

一.Oracle RDBMS架構(gòu)圖

Oracle RDBMS架構(gòu)圖

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

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

  • 數(shù)據(jù)庫 = 數(shù)據(jù)文件 + 控制文件 +日志文件
  • 實例 = 內(nèi)存池 + 后臺進程

所以可以細分為: Oracle Server = 內(nèi)存池 + 后臺進程 + 數(shù)據(jù)文件 + 控制文件 + 日志文件

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

Oracle組成分布

二.內(nèi)存結(jié)構(gòu)

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

系統(tǒng)全局區(qū)SGA

系統(tǒng)全局區(qū)分布

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

1.高速緩存緩沖區(qū)(數(shù)據(jù)庫緩沖區(qū))

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

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

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

調(diào)優(yōu):數(shù)據(jù)庫緩沖區(qū)緩存的大小會對性能產(chǎn)生至關(guān)重要的影響,具體需要多大的Size才能成為最佳配比還要結(jié)合實際的生產(chǎn)環(huán)境而言??傮w而言可以依據(jù)以下兩點基本要求來判斷:

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

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

2.日志緩沖區(qū)

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

3.共享池

共享池的大小也對性能產(chǎn)生重要影響

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

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

4.大型池

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

5.JAVA池

只有當(dāng)應(yīng)用程序需要在數(shù)據(jù)庫中運行java存儲程序時,才需要java池。

三.進程結(jié)構(gòu)

進程結(jié)構(gòu)

1.用戶進程

用戶連接進程是連接用戶和Oracle Instance的橋梁。只有在User與Instance建立了連接以后,User才能夠?qū)racle Server進行操作。
用戶連接進程 = 用戶進程 + 服務(wù)進程 + PGA

A.用戶進程User Process

當(dāng)一個Database User請求連接到Oracle Server時,Oracle Server會創(chuàng)建User Process。

User Process的作用:

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

服務(wù)器進程和用戶進程

B.Server Process服務(wù)進程

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

Server Process的作用:

與Oracle Server直接交互 復(fù)制執(zhí)行和返回結(jié)果

C.Session會話

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

會話

2.程序全局區(qū)PGA

程序全局區(qū)

PGA:Oracle Server Process分配來專門用于當(dāng)前User Session的內(nèi)存區(qū)。該區(qū)域是私有的,不同的用戶擁有不同的PGA。

PGA包含了Server Process數(shù)據(jù)和控制信息的內(nèi)存區(qū)域。,由下列3個部分組成:

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

Oracle的connect連接和session會話與User Process緊密相關(guān)

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

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

四.后臺進程

后臺進程主要是完成數(shù)據(jù)庫管理任務(wù) ,后臺進程是Oracle Instance和Oracle Database的聯(lián)系紐帶,分為核心進程和非核心進程。

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

常用的核心進程:

常用的核心進程

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

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

數(shù)據(jù)庫寫入進程

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

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

B.檢查點(CKPT)

檢查點

Checkpoint (CKPT)檢查點進程:

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

C.進程監(jiān)視進程(PMON)

進程監(jiān)視進程

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

D.系統(tǒng)監(jiān)視進程(SMON)

系統(tǒng)監(jiān)視進程

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

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

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

主要用于記錄數(shù)據(jù)庫的改變和記錄數(shù)據(jù)庫被改變之前的原始狀態(tài),所以應(yīng)當(dāng)對其作多重備份,用于恢復(fù)和排錯。
激活LGWR的情況:
提交指令 日志緩沖區(qū)超過1/3 每三秒 每次DBWn執(zhí)行之前

F.歸檔進程(ARCn)

歸檔進程

五.存儲結(jié)構(gòu)

Oracle RDBMS存儲結(jié)構(gòu)主要由Database組成。
又能夠?qū)atabase分為物理結(jié)構(gòu)和邏輯結(jié)構(gòu)來理解。


存儲結(jié)構(gòu)

1.物理結(jié)構(gòu)

Database物理結(jié)構(gòu):是Database在操作系統(tǒng)中的文件集合,即:磁盤上的物理文件,主要由數(shù)據(jù)文件、控制文件、重做日志文件、歸檔日志文件、參數(shù)文件、口令文件組成。

A.Data Files

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

B.Redo Log Files

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

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

聯(lián)機重做日志文件:記錄連續(xù)的數(shù)據(jù)庫操作 歸檔日志文件Archived Log Files:用于時間點恢復(fù),當(dāng)RedoLogFiles存滿時,會對這些日志進行歸檔備份,以便以后還原數(shù)據(jù)時使用。

C.Control Files

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

它記錄了聯(lián)機重做日志文件、數(shù)據(jù)文件的位置、更新的歸檔日志文件的位置。它還存儲著維護數(shù)據(jù)庫完整性所需的信息,如數(shù)據(jù)庫名。控制文件是以二進制型式存儲的,用戶無法修改控制文件的內(nèi)容??刂莆募贿^數(shù)MB,卻起著至關(guān)重要的作用。

D.Parameter File

實例參數(shù)文件,當(dāng)啟動oracle實例時,SGA結(jié)構(gòu)會根據(jù)此參數(shù)文件的設(shè)置內(nèi)存,后臺進程會據(jù)此啟動。

E.Password File

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

2.邏輯結(jié)構(gòu)

表空間就是典型的Oracle邏輯結(jié)構(gòu)類型 —— 里面存放著若干的數(shù)據(jù)文件

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

表空間的作用:分類管理、批量處理; 將瑣碎的磁盤文件整合、抽象處理成為邏輯結(jié)構(gòu)。這樣更加便于我們?nèi)ス芾頂?shù)據(jù)庫。

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


段、區(qū)和塊

六.簡述Oracle運行過程

這里寫圖片描述
這里寫圖片描述
  • User訪問Oracle Server之前提交一個請求(包含了db_name、instance_name、username、password等信息),Oracle Server接收到請求并通過Password File的驗證后,分配SGA內(nèi)存池,啟動后臺進程同時創(chuàng)建并啟動實例。
  • 在啟動實例之后User Process與Server Process建立Connect。
  • 再通過Server process和Oracle Instance完成建立Sesscion。
  • 用戶執(zhí)行SQL語句,由server process接收到并直接與Oracle交互。
  • SQL語句通過Server Process到達Oracle Instance,再將SQL載入數(shù)據(jù)庫緩沖區(qū)。
  • Server Process通知Oracle Database將與SQL語句相關(guān)的數(shù)據(jù)塊副本加載到緩沖區(qū)中。
  • 在數(shù)據(jù)庫緩存區(qū)執(zhí)行SQL語句,并產(chǎn)生”臟緩沖區(qū)”。
  • 由CKPT檢查點進程檢查到”臟緩沖區(qū)”,并調(diào)用DBWn數(shù)據(jù)庫寫進程,但在DBWn執(zhí)行之前,應(yīng)該由LGWR先將數(shù)據(jù)文件的原始狀態(tài)、數(shù)據(jù)庫的改變等信息記錄到Redo Log Files。
  • 將更新的內(nèi)容寫入到磁盤中的數(shù)據(jù)文件。 返回結(jié)果給用戶
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容