- 前言
- Oracle 內存結構
- Oracle 進程結構
- 文章總結
- 上一篇文章體現了 Oracle 數據庫的一些基本結構和存儲結構,這篇文章將會講到Oracle的服務器結構,實際上就是主要講實例的結構。須要把這些底層的結構瞭解,在生產環境或是對Oracle纔會有一些瞭解。
- Oracle服務器是由Oracle實例+Oracle數據庫組成。
- Oracle實例是有SGA+後臺進程組成。 每個Oracle實例都有本身的SGA和獨立的Oracle進程集。
以上圖很好說明了內存的結構,下面將會詳細介紹內存結構。算法
內存結構是Oracle數據庫體系中最爲重要的一部分,數據庫實例啓動時,Oracle數據庫會分配內存區並啓動後臺進程。
Oracle內存存儲的主要內容有:數據庫
- 程序代碼(PL/SQL、Java);
- 關於已經連接的會話的信息,包括當前全部活動非活動的會話;
- 程序運行時必須的相關信息,如查詢計劃;
- Oracle 進程之間的通訊和共享的信息,如:鎖。
1·系統全局區 (SGA):Oracle啓動實例時分配系統全局區 2·程序全局去 (PGA):當服務器啓動時分配程序全局區 3·用戶全局區 (UGA):用戶全局區爲用戶存儲會話狀態
系統全局區 (SGA):數據庫信息存儲於系統全局區,由多個數據庫共享。是佔用服務器內存最大的一個區域,是影響數據庫最重要的一個指標,和後臺進程組成了Oracle實例。緩存
系統全局區 (SGA)的組成:安全
* 共享池 (含:庫高速緩存、數據高速字典緩存); * 數據高速緩存; * 重作日誌緩衝區; * Java池; * 大緩衝區。
共享池:是對SQL、PLSQL程序進程語法分析、編譯、執行的內存區域。是由兩個關鍵內存結構組成,分別是:
1·庫高速緩存:存儲最近解析使用的 SQL和PL/SQL語句信息。Oracle 在執行用戶進程提交的各類SQL語句前要對進行解析(包括語法解析、對象確認、權限判斷、操做優化等)並生產執行計劃,佔用必定的系統資源。
2·數據字典高速緩存:最近使用對象定義的集合,包括數據文件、表、索引、列、用戶、權限、和數據庫對象的信息。服務器
數據高速緩存區:能夠加快訪問速度,把一些常常用到的都放到緩存區,由於數據庫的目的除了安全還有就是訪問效率。服務器進程將讀入的數據保存在數據緩衝區中,當後續請求須要這些數據就在內存中找到,不須要從磁盤讀取。全部用戶共享。由三個池組成:1·默認池, 2·保持池(存放經常使用的數據) 3·回收池(存放不常使用的數據存),經過LRU算法管理。
LRU算法管理:它的原理是把經常使用的數據保留在池中,不經常使用的數據就退回去。ide
重作日誌緩衝區:錄全部的關於數據庫的變化,當執行DML,如:updata、delete、insert或create、alter、drop等語句時,Oracle都會爲這些操做生產重作記錄,做用是:主要用於數據庫恢復、改變的數據都要依賴於redo日誌條目。
性能
大緩衝區:用於須要大內存操做提供相對獨立的內存空間,以便提升性能,大池是可選的內存結構,DBA能夠決定是否須要在SGA中建立大池,好比:數據庫備份和恢復、大量排序的SQL語句、並行化的數據庫操做。優化
Java池:在安裝Java程序時必須設置Java池,編譯Java語言寫的指令。3d
SQL> show sga; ----------------(查看 系統全局區 SGA 大小)日誌
Total System Global Area 1593835520 bytes Fixed Size 8793256 bytes Variable Size 905970520 bytes Database Buffers 671088640 bytes Redo Buffers 7983104 bytes
當服務器啓動時分配的全局區,就是Oracle服務器啓動時須要佔用的內存!
- 它包含單個服務器進程所需的數據和控制信息
- 是在用戶進程鏈接到數據庫並建立一個會話時自動分配的,保持每一個與Oracle數據庫鏈接的用戶進程所需的信息
- PGA爲非共享區,只能單個進程使用,當一個用戶會話結束,PGA釋放。
- 用戶進程存儲會話狀態,就是你用哪一個用戶登錄,會存儲一些用戶的狀態!
- UGA能夠做爲PGA於SGA的一部分,具體位子取決於如何鏈接Oracle:若經過一個共享服務器鏈接,UGA包含在SGA中;如果經過一個專有服務器鏈接Oracle,UGA包含在專有服務器PGA中
Oracle 實例有如下幾種進程:
* 用戶進程 * 服務器進程 * 後臺進程
用戶進程是一個須要與Oracle服務器進行交互的程序。當用戶運行一個程序準備向數據庫服務器發送請求時,即建立了用戶進程!
服務器進程是用於處理鏈接該實例的用戶進程的請求。當用戶鏈接到Oracle實例建立會話時,建立的服務器進程!
- 後臺進程是Oracle數據庫爲了保持系統最佳系統性能和協調多個用戶請求而設置的。Oracle實例啓動時則建立一系列的後臺進程!
- 後臺進程使數據庫的內存結構和數據庫物理結構之間協調工做。
- 後臺進程必須啓動的5個進程分別是:DBWR、LGWR、PMON、SMON、CKPT。
PMON 進程監控進程:
* 清理出現故障的進程; * 釋放當前全部掛載的鎖定; * 釋放故障進程使用的資源。
SMON 系統監控進程:
* 在實例失敗後,從新打開數據庫時自動恢復實例; * 整理數據文件的自由空間,將相鄰空間結合起來; * 釋放再也不使用的臨時段。
DBWR 數據寫入進程:
* 管理數據緩衝區,將最近使用過的塊保留在內存中; * 將修改後的緩衝區數據寫入數據文件中。
LGWR 日誌寫入進程:
* 負責將日誌緩衝區的日誌數據寫入日誌文件; * 系統有多個日誌文件,該進程以循環的方式將數據寫入文件。
CKPT 校驗進程:
* 從檢查點隊列上掃描髒數據塊,並將這些髒數據塊寫入數據文件中; * 檢查點隊列上的buffer header 是按照數據塊第一次被髒的時間前後順序來排列的; * 越早修改的數據塊的buffer header排在越前面; * 同時若是一個數據塊被修改了屢次的話,在該鏈表上也只出現一次。
太多的理論,還須要用圖來理解記憶!因此總結就用一張圖來表示。