成為MySQL DBA後,再看ORACLE資料庫(五、記憶體管理)

海布里_MySQL發表於2024-06-02

一、前言

在資料庫的體系結構中,記憶體區是非常關鍵的一部分,一般而言資料庫例項也是由記憶體+後臺程序組成。不同於MySQL的單程序多執行緒架構,ORACLE是多程序架構,所以在記憶體管理上也更加複雜。ORACLE的記憶體管理一般分兩部分:PGA(Program Global Area)和SGA(System Global Area)。翻開當年學習ORACLE筆記所畫的體系結構圖,這也是學習ORACLE印象最深的一張圖,很清晰的展現了ORACLE的記憶體,程序,儲存引擎等重要組成部分

二、PGA管理

PGA即程式全域性區,是伺服器程序(Server Process)使用的一塊包含資料和控制資訊的記憶體區域。對於Server Process,是當應用端向服務端發起會話連線時,Oracle會為每個會話啟動一個Oracle程序,這也是在程序管理中的專用伺服器模式,這是Oracle預設的模式。通常來說,PGA中包含私有SQL區(存放繫結資訊、執行時記憶體結構等)、Session 資訊等內容。因此可見,PGA是為會話服務的記憶體區。在PGA管理中,除了預分配的保留記憶體,PGA一般由以下兩部分組成:1.會話記憶體(Session Memory):用於存放會話的登入資訊以及其他相關資訊;2.私有SQL區:包含繫結變數資訊、查詢執行狀態資訊以及查詢工作區等,每個發出SQL查詢的會話都擁有一塊私有SQL區。

Oracle的應用程式或使用者的應用程式執行時,都可能顯示或隱式的開啟遊標(Open Cursor)來進行任務處理,開啟遊標就需要分配私有SQL區。管理私有SQL區是使用者程序的責任,而分配和回收則依賴於具體的應用程式,為了防止過度的SQL工作區分配,Oracle透過OPEN_CURSORS引數來限制每個使用者程序能夠同時開啟的遊標數量。

在PGA中,有一部分稱之為UGA(User Global Area),這也是經常見到的一個名詞,PGA與UGA 關係,就如同Process和Session的關係,PGA是服務於程序的記憶體結構,包含程序資訊;而UGA是服務於會話的,它包含的是會話的資訊。

三、SGA管理

SGA即系統全域性區,是一塊用於載入資料、物件並儲存執行狀態和資料庫控制資訊的一塊記憶體區域,通俗來講就是資料庫的資料快取區域。當資料庫啟動到nomount狀態時,SGA已經分配,同時啟動後臺程序。上面ORACLE的體系結構圖中,顯示了SGA的組成部分:

1.Buffer Cache(緩衝區快取記憶體),用於儲存最近使用的資料塊,這個就類似於MySQL的innodb_buffer_pool;

2.Shared Pool(共享池),用於快取SQL的執行計劃,字典資訊等,由於MySQL全是硬解析,所以MySQL是沒有這部分的;

3.Redo Log Buffer(日誌緩衝區),用於redo log的快取。類似MySQL中的redo log buffer;

4.Large Pool,通常用於平行計算,rman備份恢復操作;

5.Java Pool,主要用於JVM等Java 選件;

關於sga各個區的使用資訊可以透過v$sgainfo檢視查詢,更詳細的分配和使用資訊還可以透過v$sgastat檢視查詢。

四、自動記憶體管理

在透過dbca建立資料庫時dbca.rsp檔案中有個引數TOTALMEMORY,設定了資料庫可用的最大記憶體,ORACLE根據這個值自動分配sga和pga的大小。此外,ORACLE中有個引數memory_target,這是一個動態引數,只要開啟了這個引數,Oracle資料庫將自行決定SGA以及PGA的分配和使用,這極大的簡化了DBA對於記憶體的調整和管理工作。ORACLE還有個引數memory_max_target,這是一個靜態引數,表示oracle例項的可以達到的最大記憶體大小,memory_target最大不能超過memory_max_target。對於sga,sga_max_size參數列示sga可以達到的最大記憶體大小,sga_target表示sga實際使用的實際記憶體大小,不能大於sga_max_size;對於pga,則透過pga_aggregate_target引數來指定pga最大可用的記憶體。

對比MySQL,我認為ORACLE的記憶體管理更加嚴謹,ORACLE把記憶體管理分為sga和pga,並且透過自動記憶體管理,dba無需再額外設定各個記憶體區域的引數值。而在MySQL中,除了引數innodb_buffer_pool_size的設定,還需要設定innodb_log_buffer_size、read_rnd_buffer_size、tmp_table_size等引數,此外MySQL分配給會話使用的記憶體和performance_schema使用的記憶體也需要關注,任何一個地方設定不合理或出現問題都可能導致整個系統記憶體使用率過高,在記憶體管理方面MySQL是更容易踩坑的。

相關文章