- Oracle 12c云數據庫備份與恢復技術
- 姚世軍
- 1715字
- 2019-10-14 11:45:04
1.3.2 內存結構
當數據庫實例啟動時,Oracle數據庫服務器分配內存并啟動若干后臺進程。Oracle實例在啟動時創建的內存結構用來保存數據庫實例在運行過程中所需要處理的數據,主要記錄如下內容:
①被執行的程序代碼,即解析后的SQL或PL/SQL程序代碼。
②用戶連接會話信息,包括不活動的會話信息。
③緩存的數據,如用戶查詢和修改過的數據塊以及重做記錄等。
④程序運行時所需的各種信息,如查詢狀態等。
⑤進程之間共享和通信時所需的信息,如數據加鎖信息等。
根據內存中存放的內容將數據庫基本內存結構分為軟件代碼存儲區、系統全局區(System Global Area,SGA)、程序全局區(Program Global Are,PGA)和用戶全局區(User Global Are,UGA)四部分。
軟件代碼區存放正在運行或可以運行的程序代碼。Oracle數據庫代碼是與用戶程序分開的,存儲在更加受保護的區域。SGA是由所有服務進程和后臺進程所共享的內存段,它包含數據庫實例的數據與控制信息。PGA是存放每個Oracle進程(如服務進程和后臺進程)私有的數據和控制信息的非共享內存,它是在Oracle進程啟動時由Oracle數據庫創建的。Oracle中每個進程都擁有自己的PGA區。用戶全局區UGA存放的是用戶會話相關的內容。
Oracle的實例內存結構如圖1-2所示。

圖1-2 Oracle的實例內存結構
從圖1-2可以看出,SGA中的數據被所有進程所共享,PGA中的數據只能由每個進程訪問。
1.系統全局區SGA
SGA是一組可讀寫共享內存結構,包含一個Oracle數據庫實例的數據和控制信息。如果多個用戶并發連接到同一個實例,那么SGA中的數據由多個用戶共享。每個Oracle實例只有一個SGA,SGA區中的信息能夠被所有Oracle進程共享使用。數據庫的各種操作主要都是在SGA區中進行的。
SGA區中保存著在進行數據管理、重做日志管理以及SQL程序分析時所必需的共享信息,主要包括數據庫緩存、重做日志緩存、共享池、Java池和大型池等緩存塊。這里主要介紹數據庫緩存和重做日志緩存的概念。
(1)數據庫緩存(Database Buffer Cache)
數據庫緩存是SGA中保存最新從數據文件中讀取的數據,所有連接到實例中的用戶都共享數據庫緩存。當用戶向數據庫請求數據時,如果所需的數據已經位于數據庫緩存中,則將直接從數據庫緩存中提取數據并將其返回用戶;如果不在數據庫緩存中,則將從數據文件中讀取數據到數據庫緩存。
(2)重做日志緩存(Redo Log Buffer)
重做日志緩存是存儲對數據庫所做修改信息的緩存區,這些重做信息以重做記錄的形式存放。重做記錄包含重做構造變化所需的各種信息。每當用戶執行INSERT、UPDATE、DELETE等語句對表進行修改時,或者執行CREATE、ALTER、DROP等語句創建或修改數據庫對象時,Oracle都會自動為這些操作生成重做記錄。重做記錄是由Oracle服務進程將它們從用戶內存空間復制到SGA的重做日志緩存,然后由LGWR后臺進程把重做日志緩存中的內容寫入聯機重做日志文件中。
重做日志緩存是一個循環緩存區,在使用時從頂端向底端寫入數據,然后返回到緩沖區的起始點循環寫入。重做日志緩存占用緩存區中的連續存儲空間。
(3)查詢SGA
所有數據庫后臺進程和服務進程都可以讀SGA中的信息,數據庫操作期間服務進程也可以寫入SGA中。如果系統使用共享服務結構,那么請求隊列和響應隊列及PGA中的部分內容也在SGA中。
如果要了解SGA內存的大小,可以在SQL * Plus中執行SHOW SGA命令或查詢動態性能視圖V$SGA。如果要顯示SGA更詳細的信息,可以查詢動態性能視圖V$SGASTAT。
2.程序全局區PGA
(1)PGA的概念
程序全局區PGA是在用戶進程連接數據庫并創建會話時由Oracle為服務進程分配的,專門用來保存服務進程的數據和控制信息的內存結構。只有服務進程本身能夠訪問它自己的PGA區。每個服務進程都有自己的PGA區,各個服務進程PGA區的總和即為實例的PGA區的大小。PGA的大小由操作系統決定,并且分配后保持不變。
(2)查詢PGA信息
在Oracle數據庫中,可以從下面幾個動態性能視圖中查詢PGA區內存分配信息:
● V$SYSSTAT 系統統計信息和用戶會話統計信息。
● V$PGASTAT 顯示內存使用統計信息。
● V$SQL_WORKAREA SQL游標所用工作區的信息。
● V$SQL_WORKAREA_ACTIVE 當前系統工作區的信息。
3.用戶全局區
用戶全局區(UGA)是會話內存區,即為登錄信息等數據庫會話所需的會話變量分配的內存,它本質是存儲的會話狀態。UGA由會話變量和OLAP池兩部分組成。
UGA在整個會話生命周期內必須都可以使用。因此,在共享服務器連接時不能將UGA存儲在PGA中,因為PGA是單個進程專用的,即在共享服務器連接時,UGA存儲在SGA中,從而保證每個共享服務器進程都可以訪問它。當使用專用服務器連接時,UGA存儲在PGA中。