標籤:
目錄
- 目錄
- 前言
- Oracle的體繫結構
- Oracle RDBMS架構圖
- 儲存結構
- 物理結構
- Data Files
- Redo Log Files
- Control Files
- Parameter File
- Password File
- 邏輯結構
- 邏輯空間到物理空間的映射
- 記憶體結構
- 系統全域區SGA
- 快取緩衝區資料庫緩衝區
- 日誌緩衝區
- 共用池
- 大型池
- JAVA池
- 進程結構
- 使用者串連進程
- 程式全域區PGA
- 使用者進程User Process
- Server Process服務進程
- 後台進程
- 資料庫寫入進程DBWn
- 檢查點CKPT
- 進程監視進程PMON
- 系統監視進程SMON
- 重做記錄檔和日誌寫入進程
- 歸檔進程ARCn
- 執行一條寫入的SQL語句時在RDBMS中都發生了什麼
- 最後
前言
Oracle架構,講述了Oracle RDBMS的底層實現原理,是Oracle DBA**調優和排錯**的基礎理論。深入理解Oracle架構,能夠讓我們在Oracle的路上走的更遠。對Oracle體繫結構的理解是一個深遠的過程,需要不斷的更新修改,如有不對,還望指正。:)
Oracle的體繫結構Oracle RDBMS架構圖
Oracle Server = 執行個體 + 資料庫 (Instalce和Database是相互獨立的)
- 資料庫 = 資料檔案 + 控制檔案 +記錄檔
- 執行個體 = 記憶體池SGA + 後台進程
==> Oracle Server = 記憶體池 + 後台進程 + 資料檔案 + 控制檔案 + 記錄檔
一套Oracle RDBMS支援建立多個Database,而且每個Datacase是互相獨立的。不同的Database擁有屬於自己的全套相關檔案,例如:有各自的密碼檔案,參數檔案,資料檔案,控制檔案和記錄檔。
Database由一些物理檔案(存放在存放裝置中的二維表檔案)組成,我們的表格儲存體在Database中。Database的內容不能被我們直接讀取,必須通過Oracle instance來訪問Database,一個Instance只能串連一個Database,但是一個Database可以被多個Instance串連。
將上面的Oracle架構圖進行抽象分類,可以將Oracle架構抽象為:Oracle體系 = 記憶體結構 + 進程結構 + 儲存結構
儲存結構
Oracle RDBMS儲存結構主要由Database組成。
又能夠將Database分為物理結構和邏輯結構來理解。
物理結構
Database物理結構:是Database在作業系統中的檔案集合,即:磁碟上的物理檔案,主要由資料檔案、控制檔案、重做記錄檔、歸檔記錄檔、參數檔案、口令檔案組成。
Data Files
資料檔案是資料的儲存倉庫。
? 包括所有的資料庫資料
? 只能屬於一個資料庫
? 來自於被稱為”資料表空間”的資料庫存放裝置邏輯單元
? 可以直接被讀進記憶體,在執行SQL語句的時候,會將相關的資料檔案副本載入如資料緩衝區。
? 通過備份策略可以使資料檔案得到保護
Redo Log Files
重做記錄檔包含對資料庫所做的更改操作記錄,在Oracle發生故障時能夠恢複資料。
能夠恢複資料的原理:重做記錄檔會按時間的順序,將應用於資料庫的一連串的變更向量(做了什麼操作)儲存起來(即將變更的地方標記起來)。其中包含了所有已經完成操作的資訊和完成操作之前的資料庫狀態。如果資料檔案受損,就可以將這些變更向量應用於資料檔案備份來進行重做(重建)工作,將它恢複到發生故障的那一刻前的狀態。重做記錄檔又分為下面兩種類型:
- 聯機重做記錄檔:記錄連續的資料庫操作
- 歸檔記錄檔Archived Log Files:用於時間點恢複,當RedoLogFiles存滿時,會對這些日誌進行歸檔備份,以便以後還原資料時使用。
SQL> select member from v$logfile; # v$logfile資料字典,記錄了redolog檔案的列表 MEMBER-------------------------------------------------------------------------------- /u01/oradata/demo/redo03.log /u01/oradata/demo/redo02.log /u01/oradata/demo/redo01.log
Control Files
控制檔案包含維護和驗證資料庫完整性的必要的資訊。
它記錄了聯機重做記錄檔、資料檔案的位置、更新的歸檔記錄檔的位置。它還儲存著維護資料庫完整性所需的資訊。控制檔案不過數MB,卻起著至關重要的作用。
Parameter File
執行個體參數檔案,當啟動oracle執行個體時,SGA結構會根據此參數檔案的設定記憶體,後台進程會據此啟動。
Password File
使用者通過提交username/password來建立會話,Oracle根據儲存在資料字典的使用者定義對使用者名稱和口令進行驗證。
邏輯結構
資料表空間就是典型的Oracle邏輯結構類型 —— 裡面存放著若干的資料檔案
資料表空間:用於儲存資料庫物件的邏輯空間,資料表空間是在資料庫中開闢的一個空間,用於存放資料庫的對象,它是資訊儲存的最大邏輯單位,是存放資料庫檔案的地方,其中資料又被存放在資料表空間中的資料檔案中。一個資料庫可以由多個資料表空間組成,Oracle的調優就是通過資料表空間來實現的。(Oracle資料庫獨特的進階應用程式)
資料表空間的作用:分類管理、批量處理; 將瑣碎的磁碟檔案整合、抽象處理成為邏輯結構。這樣更加便於我們去管理資料庫。
邏輯空間到物理空間的映射
段、區和塊:
記憶體結構
Oracle Instance是Oracle RDBMS的核心之一,作為整個RDBMS的管理中心。而Oracle Instance主要由記憶體池和後台進程組成。
系統全域區SGA
查看SGA:本質就是記憶體池
SQL> conn /as sysdbaConnected.SQL> show user;USER is "SYS"SQL> select * from v$sga;NAME VALUE-------------------- ----------Fixed Size 2022144Variable Size 503317760Database Buffers 1627389952Redo Buffers 14753792SQL> show sgaTotal System Global Area 2147483648 bytesFixed Size 2022144 bytesVariable Size 503317760 bytesDatabase Buffers 1627389952 bytesRedo Buffers 14753792 bytes
SGA(System Global Area)是與Oracle效能關係最大的核心部分,SGA記憶體池會在Instance啟動時分配,在關閉時釋放。在一定範圍內,可以在Instance運行時通過自動方式響應DBA的指令。SGA包含了如下幾種資料結構:
快取緩衝區(資料庫緩衝區)
資料庫緩衝區是oracle執行SQL語句的地區。
例如在更新資料時,使用者執行的SQL語句不會直接對磁碟上的資料檔案變更操作,而是首先將資料檔案複製到資料庫緩衝區快取(就是說資料庫緩衝區裡會存放著SQL相關資料檔案副本),再更改應用於資料庫緩衝區快取中這些資料區塊的副本。而且資料區塊副本將在緩衝中保留一段時間,直至其佔用的緩衝區被另一個資料庫覆蓋為止(緩衝區Size有限)。
在查詢資料時,為了提高執行效率,查詢的資料也要經過緩衝。建立的Session會計算出那些資料區塊包含關鍵的行,並將它們複製到資料庫緩衝區中進行緩衝。此後,相關關鍵行會傳輸到Session的PGA作進一步處理。這些資料區塊也會在資料庫緩衝區緩衝中保留一段時間。
一般情況下,被頻繁訪問的資料區塊會存在於資料庫緩衝區快取中,從而最大程度地減少對磁碟I/O的需要。
那什麼時候會將被更新的資料區塊副本寫入到磁碟中的資料檔案呢?
答:如果在緩衝區快取中儲存的資料區塊與磁碟上的資料區塊不同時,那麼這樣的緩衝區常稱為“髒緩衝區”,髒緩衝區中的資料區塊副本就必須寫回到磁碟的資料檔案中。
注意:資料庫緩衝區快取的大小會對效能產生至關重要的影響。
1. 緩衝應足夠大,以便能緩衝所有被頻繁訪問的資料區塊。
2. 但也不能太大,以至於它會將極少被訪問的塊也一併加入到緩衝中,這樣會增長在緩衝中搜尋的時間。
3. 如果緩衝過小,那麼將導致磁碟I/0活動過多,因為頻繁訪問的資料區塊持續從磁碟讀取,並由其他資料區塊使用和重寫,然後再從磁碟讀取。
資料庫緩衝區快取在Instance啟動時被分配。從資料庫9i開始,可以隨時將其調大或調小。可以採用手動方式重調,也可以根據工作負載自動重調大小(事務)。
修改緩衝區DB_CACHE_SIZE地方法:
#Step1. 查看SGA的大小:因為DB_CACHE_SIZE的size受SGA的影響SQL> show parameter sga_max_size; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ sga_max_size big integer 2G#Step2. 查看show parameter shared_pool_size的大小SQL> show parameter shared_pool_size; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------shared_pool_size big integer 0#Step3. 計算DB_CACHE_SIZE的大小:shared_pool_size + db_cache_size = SGA_MAX_SIZE * 70%#Step4. 修改DB_CACHE_SIZE的大小SQL> alter system set db_cache_size=1433M scope=spfile sid=‘demo‘;System altered.SQL> conn sys /as sysdbaEnter password: ********Connected.SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startupORACLE instance started.Total System Global Area 2147483648 bytesFixed Size 2022144 bytesVariable Size 503317760 bytesDatabase Buffers 1627389952 bytesRedo Buffers 14753792 bytesDatabase mounted.Database opened.SQL> show parameter db_cache_size
日誌緩衝區
日誌緩衝區是小型的、用於短期儲存將寫入到磁碟上的重做日誌的變更向量的臨時地區。主要作用是提供更加快的Tlog效率。
共用池
共用池的大小對效能產生重要影響
1. 它應該足夠大,以便緩衝所有頻繁執行的代碼和頻繁訪問的對象定義。
2. 但也不能過大,以至於連僅執行一次的語句也要緩衝。
3. 如果共用池過小,則效能下降,因為伺服器會話將反覆搶奪其中的空間來分析語句,此後,這些語句會被其他語句重寫,在重新執行時,將不得不再次分析。
4. 過大的共用池也會對效能產生不良影響,因為搜尋需要的時間過長。
5. 如果共用池小於最優容量,則效能將下降。但有一個最小容量,如果低於此限度,則語句將失敗。
確定最優容量是一個效能調整問題,大多數資料庫都需要一個數百MB的共用池。有些應用程式需要1GB以上的共用池,但很少有應用程式能夠在共用池小於100MB時充分運行。共用池內有下列三種資料結構:
- 庫緩衝:儲存最近執行的代碼
- 資料字典緩衝:儲存最近使用的對象定義
- PL/SQL緩衝區:儲存的PL/SQL對象是過程、函數、打包的過程、打包的函數、物件類型定義和觸發器。
手動的調整共用池的大小:
select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE from v$sga_dynamic_components; //顯示可以動態調整大小的SGA組件的當前最大和最小容量ALTER SYSTEM SET SHARED_POOL_SIZE = 110M;
大型池
主要用途是供共用的伺服器處理序使用。
JAVA池
只有當應用程式需要在資料庫中運行java儲存程式時,才需要java池。
進程結構
進程結構主要是由後台進程和使用者串連進程組成。
使用者串連進程
串連和系統管理使用者訪問 = 使用者進程 + 服務進程 + PGA
程式全域區PGA
PGA是串連使用者和Oracle的橋樑。
PGA用於為使用者串連時分配記憶體、Oracle RDBMS需要使用這些記憶體來建立Instence、只有在Instance建立完成後,使用者才能夠通過Instance來串連並管理Oracle Database。
使用者進程User Process
Oracle的connect串連和session會話與User Process緊密相關:
1. connect串連:是User Process和Oracle Instance之間的通訊通道,一個串連對應一個執行個體。
2. session會話:一個使用者通過User Process與Oracle Instance建立串連後稱之為一個會話,一個使用者可以建立多個會話,即可以同時使用同一個使用者可以多次的串連到同一個執行個體。多個會話可以使用同一個串連。
Server Process服務進程
用於處理User和Server之間的串連
後台進程
後台進程主要是完成資料庫管理工作 ,後台進程是Oracle Instance和Oracle Database的聯絡紐帶,分為核心進程和非核心進程。
1. 核心進程:核心進程,必須存在,有一個終止,所有資料庫進程全部終止,執行個體崩潰!其中五大進程全都是核心進程。
2. 非核心進程:完成資料庫的額外功能,非核心進程死亡資料庫不會崩潰!
常用的核心進程:
在訪問資料庫時,首先會啟動執行個體。啟動執行個體前要先分配SGA記憶體池,然後啟動後台進程。資料庫啟動過程中必須啟動上面的前五個進程。否則執行個體無法建立。
查看後台核心進程:
SQL> select name,description from v$bgprocess where paddr<>‘00‘;NAME DESCRIPTION----- ----------------------------------------------------------------PMON process cleanupPSP0 process spawner 0MMAN Memory ManagerDBW0 db writer process 0LGWR Redo etc.CKPT checkpointSMON System Monitor ProcessRECO distributed recoveryCJQ0 Job Queue CoordinatorQMNC AQ CoordinatorMMON Manageability Monitor ProcessNAME DESCRIPTION----- ----------------------------------------------------------------MMNL Manageability Monitor Process 2
資料庫寫入進程(DBWn)
Server process串連Oracle後,通過資料庫寫進程(DBWn)將資料緩衝區中的“髒緩衝區”的資料區塊寫入到儲存結構(資料檔案、磁碟檔案)
Database writer (DBWn)資料庫寫進程:
只做一件事,將資料寫到磁碟。就是將資料庫的變化寫入到資料檔案。
該進程最多20 個,即使你有36 個CPU 也只能最多有20 個資料庫寫進程。
進程名稱DBW0-DBW9 DBWa-DBWj
注意:資料庫寫進程越多,寫資料的效率越高。該進程的個數應該和cpu的個數對應,如果設定的資料庫寫進程數大於CPU 的個數也不會有太明顯的效果,因為CPU 是分時的。
檢查點(CKPT)
Checkpoint (CKPT)檢查點進程:
主要使用者更新資料檔案頭,更新控制檔案和觸發DBWn資料庫寫進程。
Ckpt 進程會降低資料庫效能,但是提高資料庫崩潰時,自我恢複的效能。我們可以理解為階段性的儲存資料,一定的條件滿足就觸發,執行DBWn存檔操作。
進程監視進程(PMON)
Process monitor (PMON)進程監測進程:
PMON在後台進程執行失敗後負責清理資料庫緩衝和閑置資源,是Oracle的自動維護機制。
- 清除死進程
- 重新啟動部分進程(如調度進程)
- 監聽的自動註冊
- 復原事務
- 釋放鎖
- 釋放其他資
系統監視進程(SMON)
System monitor (SMON)系統監測進程:
SMON啟動後會自動的用於在執行個體崩潰時進行資料庫執行個體自動回復。
清除作廢的排序臨時段,回收整理片段,合并空閑空間,釋放臨時段,維護閃回的時間點。
在老資料庫版本中,當我們大量刪除表的時候,會觀測到SMON進程很忙,直到把所有的片段空間都整理完畢。
重做記錄檔和日誌寫入進程
主要用於記錄資料庫的改變和記錄資料庫被改變之前的原始狀態,所以應當對其作多重備份,用於恢複和排錯。
啟用日誌寫入進程的情況:
- 提交(斷行符號)
- 日誌緩衝區超過1/3
- 每三秒
- 每次DBWn執行之前
歸檔進程(ARCn)
歸檔進程(ARCn)是非核心進程。
執行一條寫入的SQL語句時在RDBMS中都發生了什麼
1. 將SQL語句載入入資料庫緩衝區
2. 將SQL語句要操作的資料檔案副本載入入資料庫緩衝區
3. 執行SQL語句,修改資料檔案副本,形成“髒緩衝區”
4. CKPT檢測到“髒緩衝區”,調用DBWn
5. 在DBWn運行之前,先運行了LGWR,將資料檔案的原始狀態和資料庫的改變記錄到Redo Log Files
6. 運行DBWn,將“髒緩衝區的內容寫入到資料檔案”
7. 同時CKPT修改控制檔案和資料檔案頭
8. SMON回收不必要的空閑資源
最後
最後我們舉個例子來看看Oracle RDBMS是怎麼運作的
- 使用者訪問資料庫之前提交一個請求,需要先啟動一個執行個體
- 在啟動執行個體之後使用者可以串連到服務進程,完成建立串連
- 由服務進程調用PGA來為使用者指派建立執行個體所必需的記憶體SGA
- 使用者執行SQL語句,由服務進程接收到
- SQL語句通過服務進程到達Oracle Instance,再將SQL載入資料庫緩衝區
- 服務進程通知Oracle Database將資料區塊載入到緩衝區中,產生資料區塊副本
- 並在資料庫緩衝區執行SQL語句
- 將使用者登入、進程調用、資料檔案的原始狀態、資料庫的改變記錄到Redo Log Files
- 當資料庫緩衝區出現了“髒緩衝區”時,將更新的內容寫入資料檔案
Oracle架構實現原理、含五大進程解析