Oracle服務器
是一個數據庫管理系統,它提供了一種全面、開放、集成的方法來管理信息。
Oracle服務器由Oracle數據庫和Oracle實例組成。
oracle數據庫軟件和Oracle數據庫軟件可以分開存儲。oracle數據庫軟件一般存放在oralce服務器的本地硬盤上,而Oracle數據庫實例所對應的文件(.ctl、.log、.dbf)一般存放在存儲服務器上。
一個常用的冗余結構如下圖所示:
體系結構圖
存儲服務器
實例和數據庫的關系
一個Oracle數據庫可以對應多個數據庫實例。對於數據庫實例a、b,和數據庫db1,如果有1萬個用戶連接數據庫db1,則其中5千個用戶連接到實例a,5千個用戶連接到實例b(RAC技術)。
數據庫結構
Oracle內存結構
與Oracle相關聯的內存結構包括:
-
系統全局區(SGA):由所有服務器進程后台進程共享
-
程序全局區(PGA): 專用於每一個服務器進程或后台進程,每一個進程使用一個PGA。
SGA是包含了數據庫實例控制信息和數據的內存區。
其中,我們需要着重關心的是共享池(Share Pool)和數據庫緩沖區高速緩存(Database buffer cache)。
SGA包含的數據結構:
-
共享池:緩存可在各個用戶之間共享的各個結構;(SQL語句以及對應的執行計划)
-
Streams 池:由Oracle Streams使用;
-
大型池:這是一個可選的區域,可為某些大型進程(如Oeacle的備份和恢復操作、I/O服務器進程)提供大量內存分配;
-
Java池:用於Java虛擬機(JVM)中特定會話的所有Java代碼和數據;
-
數據庫緩沖區高速緩存:緩存從數據庫檢索的數據塊
-
重做日志緩沖區:高速緩存重做信息(用於實例恢復),直到可以將其寫入磁盤中存儲的物理重做日志
Oracle進程結構
對於每一個用戶進程,oracle服務器都會建立一個與之對應的服務器進程。也就是說當前如果有100個用戶與oracle服務器進行連接,那么,oracle將建立100個服務器進程來處理用戶連接。
Oracle實例管理
-
控制文件:記錄了各文件存放的位置以及當前的運行狀態;
-
數據文件:存放數據;
-
重做日志文件:對數據文件所有的修改記錄;
-
系統監視器: 出現故障后,在啟動實例時執行崩潰恢復任務,對共享池中存在的內存碎片進行整理。
-
進程監視器: 用戶進程失敗時,執行進程清理任務;對sql process進行整理。
-
數據庫寫進程:將數據庫緩沖區高速緩存中修改后的的數據塊寫入數據文件;
-
日志寫進程:
觸發條件:
- 當某個事務提交時
- 當重做日志緩沖區中變化的記錄超過1MB時
- 當重做日志緩沖區中所存的記錄已超過緩沖區容量的1/3
- 在DBWR將數據庫高速緩沖區中修改過的數據塊寫到數據文件之前
- 每3秒鍾
歸檔進程: 發生日志切換時將重做日志文件復制到歸檔存儲器
檢查點: 通過更新所有數據文件的和控制文件指出新的檢查點
Oracle數據庫服務器由Oracle數據庫和Oracle實例組成,Oracle實例由系統全局區SGA的內存結構和后台進程組成。這些后台進程可以處理運行實例時所涉及到的大量后台任務。
物理數據庫結構
SQL解析剖析
讀數據
-
客戶端輸入SQL語句
-
SQL語句通過網絡到達數據庫實例
-
server process接收SQL語句
3.1 判斷SQL在Shared Pool中是否存在緩存
a. 如果有,則在shared pool中找到對應的sql語句以及對應的執行計划,然后再去執行
b. 執行3.1
3.1 SQL解析成執行計划,然后才能執行
解析流程:
a. 判斷SQL語法是否存在問題
b. 判斷SQL對應的表、視圖是否存在
c. 判斷用戶是否有對應表、視圖的權限
d. 判斷如何執行(挑出最優的執行計划作為執行計划,最費時間,耗費CPU,I/O資源)
e. 選擇最優執行方案生成執行計划
3.1 執行SQL
SQL Process根據SQL語句對應的執行計划,執行SQL,讀取高速緩存,如果緩存中存在數據,則將緩存中的數據返回給用戶,否則讀取dbf中的數據並將數據存入緩存,然后將數據返回給用戶。
邏輯讀:從內存中讀取數據
物理讀:從物理磁盤中讀取數據
緩存命中率: 命中率低一定有問題,命中率高不一定沒問題。
比起緩存命中率,我們更關心每秒物理讀。
寫數據
sql process 將表讀到內存中,然后再對表進行修改。Oracle數據庫對dbf文件的修改都會強日志。
數據庫寫進程(DBWn)負責將修改后的數據寫入數據文件dbf。
日志寫進程(LGWR)將日志寫入日志文件。
(單一職責原則)
軟解析和硬解析
軟解析: 從高速緩存中獲取執行計划
硬解析:對SQL process接收到的SQL進行解析,判斷sql語法,查詢的表是否存在,是否有權限,判斷如何執行(挑出最優的執行計划作為執行計划,最費時間,耗費CPU,I/O資源);
SQL Process執行sql后,會將數據放入高速緩存,再由DBRn和LGER分別寫入數據文件dbf和日志文件log。因此,對於用戶來說,數據庫響應快慢由SQL Process直接影響。哪怕DBRn和LOWR兩個進程再繁忙,用戶也是感受不到的。
服務器進程和數據庫緩沖區高速緩沖
算法 :使用最近最少使用算法管理緩沖區
高速緩沖區狀態
- 空閑或未使用:實例剛啟動,緩沖區為空
- 已連接: SQL Process正在對內存中的數據進行讀寫操作。其他會話正在等待
- 臟數據 :緩沖中的數據和磁盤中的數據不一致(對緩沖中的數據進行了修改,但是還沒有寫入磁盤)。需要先將臟數據寫入磁盤才能騰出緩沖區。
- 干凈的 :緩沖區已解除連接。如果沒有再次使用當前內容(數據塊),現在可以考慮立即騰出緩沖區。此時,不是緩沖區中的數據快已經同磁盤中的數據保持同步,就是緩沖區中包含對數據快的讀取一致性快照。