內存結構
在Oracle數據庫系統中內存結構主要分為系統全局區(SGA)和程序全局區(PGA),SGA隨著數據庫實例的啟動向操作系統申請分配一塊內存結構,隨著數據庫實例的關閉釋放,每一個Oracle數據庫實例有且只有一個SGA。PGA隨著Oracle服務進程啟動的時候申請分配的一塊內存結構。如果在共享服務結構中PGA存在SGA中。
下圖展示Oracle的內存結構,在后面我們將用文字詳細的表述各個部件。
系統全局區(SGA)
重要提示,提高SGA的大小可以在一定程度上提高Oracle數據庫系統的性能,但你設置SGA的值如果不能鎖定在內存物理頁上,有些部分可能被交換到系統的交換文件中。這樣你的Oracle數據庫系統將變慢。
系統全局區是一組包含數據和控制信息的共享內存結構,允許Oracle服務的眾多后臺進程同時訪問或修改其中的數據,所以有些時候也被稱為“全局共享區”,參數文件中的SGA_MAX_SIZE指定SGA動態大小。
系統全局區由以下主要幾個部分組成:
※ 共享池SharedPool
※ 數據高速緩存DatabaseBufferCache
※ 重做日志緩存RedoLogBufferCache
※ Java池(可選)JavaPool
※ 大池(可選)LagerPool
共享池
共享池存儲了最近多數使用的執行SQL語句和最近使用的數據定義。它包含庫高速緩存器和數據字典緩存器這兩個與性能相關的內存結構。共享池的大小可以通過初始化參數文件(通常為init.ora)中的SHARED_POOL_SIZE決定。共享池是活動非常頻繁的內存結構,會產生大量的內存碎片,所以你要確保它盡可能足夠大。
庫高速緩存器,他又包含共享SQL區和共享PL/SQL區兩個組件區。為了提高SQL語句的性能,在提交SQL語句或PL/SQL程序塊時Oracle服務器將先利用最近最少使用(LRU)算法檢查庫高速緩存中是否存在相同的SQL語句或PL/SQL程序塊,若有則使用原有的分析樹和執行路徑。
數據字典緩存器,它收集最近使用的數據庫中的數據定義信息。它包含數據文件、表、索引、列、用戶、訪問權限、其他數據庫對象等信息。在分析階段決定數據庫對象的可訪問信息。利用數據字典緩存器有效的改善了響應時間。它的大小由共享池的大小決定。
數據高速緩存
它存儲數據文件中數據塊的拷貝。利用這種結構使數據的更新操作性能大大的提高。數據高速緩存中的數據交換同樣采用最近最少使用算法(LRU)。它的大小主要受到DB_BLOCK_SIZE決定。數據高速緩存它由DB_CACHE_SIZE、DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE這些獨立的子緩存器構成,同時它能動態的增長或收縮。
重做日志緩存
重做日志緩存器是個環狀的緩存器,它記載所有數據的改變,主要目的用于恢復。改變后的記錄內部稱為重做條目,重做條目包含重構或重做信息。它的大小由初始化參數中的LOG_BUFFER決定。
重做日志緩存尺寸若太小會導致進程競爭,并引起寫日志進程之間的競爭。
Java池
Java池是在安裝使用Java后,才在SGA中出現的一個組件,它的大小由JAVA_POOL_SIZE初始化參數決定。Java池為執行Java命令提供分析與執行內存空間。
大池
數據庫管理員可以可選配置被稱為大池的內存區,它主要用于存儲為共享服務器保存會話信息、I/O服務進程、Oracle備份與恢復操作、并行的消息緩存等內容。
值得一提的是大池不像其他內存組件中存在LRU列表。
程序全局區PGA
程序全局區用于保存每一個用戶連接到數據庫的信息。連接到數據庫的信息主要有回話信息、排序信息和游標信息等三方面。
進程結構
Oracle的進程主要分為用戶進程、服務進程和后臺進程三類。用戶進程運行在應用或Oracle工具中;服務進程在一個Oracle數據庫實例啟動后當一個用戶建立連接后創建的;后臺進程則完成不同特定任務的一些進程。
Oracle的后臺進程如下:
※ 寫數據DatabaseWriter(DBW0或DBWn);
※ 寫日志LogWriter(LGWR);
※ 檢查點Checkpoint(CKPT);
※ 系統監視SystemMonitor(SMON);
※ 進程監視ProcessesMonitor(PMON);
※ 歸檔Archive(ARCn);
※ 恢復Recover(RECO);
※ 鎖管理服務LockManagerServer(LMS)–僅在RealApplicationClusters;
※ 隊列監視QueueMonitor(OMNn);
※ 調度Dispatcher(Dnnn);
※ 服務Server(Snnn);
下圖為各后臺進程之間的邏輯關系圖,在圖的后面將用文字說明這些進程的目的。
寫數據(DBWn)
數據寫進程負責將重寫塊(dirtyblock)從數據高速緩存中寫到磁盤上的數據文件里。為了使數據庫的性能受I/O限制降到最低,DBWn不是每一個塊修改時立即寫到磁盤上,而是等到符合一定條件后讀取高速緩存中的重寫塊列表,并將其指定的塊成批地寫到數據文件中。
數據寫進程活動的條件如下:
※ 服務進程無法發現可用緩存
※ 檢查點出現
※ 重寫塊到達極限
※ 超時
※ ARC發出需求
※ 表空間脫機
※ 表空間只讀
※ 表丟棄或表截斷
※ 表空間開始備份
雖然一個數據庫寫進程(DBW0)對大多數系統是足夠的,但是如果你的系統修改數據量很大要提高些性能你可以配置更多的寫進程(DBW1到DBW9和DBWa到DBWj)。這些增加的DBWn進程無法在單處理系統中使用。
初始化參數DB_WRITER_PROCESSES指定了DBWn進程的序號,此參數最大允許值為20。
寫日志(LGWR)
寫日志進程是負責管理重做日志緩存的——將重做日志從緩存區寫到磁盤重做日至文件中。LGWR寫從上次寫后開始到最后復制到緩存中的所有重做條目。
要記住Oracle數據庫系統直到LGWR將重做信息從緩存器中寫到在線重做日志才認為事務完成并發送成功代碼。LGWR進程對數據庫性能的影響不大。
寫日志在下列條件中活動:
※ 在COMMIT;
※ 緩存器使用達到三分之一時
※ 緩存器使用達到1M時
※ 每隔3秒
※ 在DBWn活動之前
檢查點進程(CKPT)
檢查點進程是負責向DBWn發送信號;用檢查點的信息更新數據文件頭;用檢查點信息更新控制文件信息。
檢查點頻繁出現、日志頻繁切換或數據庫有很多數據文件時,該進程可以減少LGWR的工作量。數據庫管理員可以通過設置初始化參數CHECKPOINT_PROCESS為TRUE或FALSE來確定這個數據庫實例是否使用檢查點進程。在初始化參數中LOG_CHECKPOINT_INTERVAL和LOG_CHECKPOINT_TIMEOUT來改變檢查點出現的頻率。設置這兩個參數要小心,多檢查點雖然能使LGWR進程工作量下降,但是過多的檢查點會導致系統處理時間和I/O時間浪費在不必要的開啟和關閉檢查點的執行上。
系統監視進程(SMON)
系統監視進程是有規律的周期性活動。它負責的目的如下:
※ 在實例啟動中如果需要執行恢復;
※ 重新分配臨時段;
※ 每隔3秒合并表空間中相鄰的自由區;
※ 根據需要將表空間或數據文件回復到聯機狀態;
※ 對于應用集群系統,它執行恢復一個失敗的CPU或Oracle實例。
系統監視這進程在數據庫系統實例啟動時如果出現故障,那么數據庫系統將無法開始工作。如果任何停止的事務因為文件只讀或脫機錯誤導致實例恢復過程中跳過,SMON將使表空間或文件回復到聯機狀態。SMON進程對于一個實例能執行實例應用集群,一個SMON對于一個實例能執行實例恢復為一個失敗CPU或實例。
進程監視進程(PMON)
進程監視進程負責在下列過程失敗后釋放相關對象:
※ 事務回退
※ 釋放相關鎖
※ 釋放相關資源
※ 重新分配發生錯誤的調度
PMON周期性的檢查調度狀態和服務進程,并重新使除Oracle有意終止以外的已停止的進程運行;PMON同樣也注冊關于實例和調度進程用于網絡監聽的信息。
如果這個進程在數據庫系統實例啟動時出現故障,那么數據庫系統也將無法開始工作。
恢復進程(RECO)
恢復進程負責自動解決恢復分步式數據庫系統中陷于失敗的分布式事務。關于此進程的詳細將在分布式數據庫章節中介紹。
歸檔進程(ARCn)
這是一個可選的后臺進程。只有當Oracle數據庫實例運行在歸檔模式時出現。歸檔進程負責在日志文件切換時將所有重做日志信息復制到指定的設備文件中。
一個Oracle數據庫實例最多可以擁有(ARC0到ARC9)10個歸檔進程。
其他Oracle的后臺進程,如鎖管理服務、隊列監視、調度等均不是一個Oracle數據庫實例必須的,我們將在后面相關的部分再介紹他們。