一.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 Instance是Oracle RDBMS的核心之一,負責RDBMS的管理功能。Oracle Instance主要由內存池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才能成為最佳配比還要結合實際的生產環境而言。總體而言可以依據以下兩點基本要求來判斷:
- 緩存應足夠大,以便能緩存所有被頻繁訪問的數據塊。如果緩存過小,那么將導致磁盤I/0活動過多,因為頻繁訪問的數據塊持續從磁盤讀取,并由其他數據塊使用和重寫,然后再從磁盤讀取。
- 但也不能太大,以至于它會將極少被訪問的塊也一并加入到緩存中,這樣會增長在緩存中搜索的時間。
數據庫緩沖區緩存在Instance啟動時被分配。從數據庫9i開始,可以隨時將其調大或調小。可以采用手動方式重調,也可以根據工作負荷自動重調大小(事務)。
2.日志緩沖區
日志緩沖區是小型的、用于短期存儲將寫入到磁盤上的重做日志的變更向量的臨時區域。主要作用是提供更加快的日志處理效率。
3.共享池
共享池的大小也對性能產生重要影響
- 它應該足夠大,以便緩存所有頻繁執行的代碼和頻繁訪問的對象定義。如果共享池過小,則性能下降,因為服務器會話將反復搶奪其中的空間來分析語句,此后,這些語句會被其他語句重寫,在重新執行時,將不得不再次分析。如果共享池小于最優容量,則性能將下降。但有一個最小容量,如果低于此限度,則語句將失敗。
- 但也不能過大,以至于連僅執行一次的語句也要緩存。過大的共享池也會對性能產生不良影響,因為搜索需要的時間過長。
確定最優容量是一個性能調整問題,大多數數據庫都需要一個數百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個部分組成:
- 棧空間:存儲Session的變量、數組等的內存空間。
- Session Info:如果運行的不是多線程服務器,會話信息將保存在PGA中,如果是多線程服務器,則保存在SGA中。
- 私有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。
- 將更新的內容寫入到磁盤中的數據文件。 返回結果給用戶