Oracle 服務器主要又實例、數據庫、程序全局區和前臺進程組成。前端
實例能夠進一步劃分爲系統全局區(SGA)和後臺進程(PMON、SMON等)兩部分,其中,SGA 使用操做系統的內存資源,然後臺進程須要使用 CPU 與內存資源。數據庫(Database)中包含數據文件(Data files)、控制文件(Control files)和重作日誌文件(Redo log file),數據庫文件存放在硬盤中。程序全局區(PGA)是一個非共享的內存區域,用於管理用戶進程的私有資源。前臺進程能夠再劃分爲用戶進程和服務器進程,它們須要使用 cpu 與內存資源。數據庫
系統全局區(System Global Area)是全部用戶進程共享的一塊內存區域,也就是說,SGA 中的數據資源能夠被多個用戶進程共同使用。SGA 主要由高速數據緩衝區、共享池、重作日誌緩衝區、Java池和大型池等內存結構組成。SGA 隨着數據庫實例的啓動而加載到內存中,當數據庫實例關閉時,SGA區域也就消失了。後端
高速數據緩衝區中存放着 Oracle 系統最近訪問過的數據塊(數據塊在高速緩衝區中也可稱爲緩存塊)。當用戶向數據庫發出請求時,若是在高速數據緩衝區中存在請求的數據則 Oracle 系統會直接從高速緩衝區中讀取數據並返回給用戶,不然,Oracle 系統會打開數據文件讀取請求的數據。緩存
若沒法在高速數據緩衝區中找到所須要的數據,則Oracle 首先從數據文件中讀取指定的數據塊到緩衝區,而後再從緩衝區將請求的數據返回給用戶。因爲高速數據緩衝區被全部用戶共享,只要數據文件中的某些數據塊被當前或其餘用戶請求過,那麼這些數據塊就會被裝載到高速數據緩衝區中。這樣當任何用於再次訪問相同的數據時, Oracle 就沒必要再從數據文件中讀取數據,而是能夠直接將緩衝區中的數據返回給用戶。常常或最近被訪問的數據塊會被放置到高速數據緩衝區前端,不常被訪問的數據塊會被放置到高速數據緩衝區的後端,當高速緩衝區填滿時,會自動擠掉一些不常被訪問的數據塊。服務器
以存取速度來看,內存的讀取速度遠快於物理硬盤,因此高速數據緩衝區的存在可大大下降對物理磁盤的讀取頻率,從而達到提升數據庫服務器性能的目的。爲了便於管理SGA 的內存數據, Oracle 把高速數據緩衝區劃分爲如下3個部分:網絡
(1)髒數據區:髒數據區中存放着已被修改過的數據,這些數據等待被寫入到數據文件中。當一條更新或刪除語句對某些數據庫中的數據修改後,那麼這些數據塊就被標記爲 」髒「,而後等待提交命令並經過後臺進程 DBWR 將其寫入到數據文件中。數據結構
(2)空閒區:空閒區中的數據塊不包含任何數據,這些數據塊能夠被寫入數據,Oracle 能夠從數據文件中讀取數據塊,並將其存放到該區中。異步
(3)保留區:保留區包含那些正在被用戶訪問的數據塊和明確保留以做爲未來使用的數據塊(即緩存塊),這些數據塊將被保留在緩衝區中。分佈式
重作日誌緩衝區用於存放數據庫進行修改操做時所產生的日誌信息,這些日誌信息在寫入到重作日誌文件以前,首先存放重作日誌緩衝區中,而後,在檢查點發生或重作日誌緩衝區中的信息量達到必定峯值時,最後由日誌寫入進程(LGWR)將此緩衝區的內容寫入到重作日誌文件。性能
重作日誌緩衝區的大小由 LOG_Buffer 參數指定,該參數也能夠在實例啓動後動態修改。相對於高速數據緩衝區而言,重作日誌緩衝區的大小對數據庫性能的影響較小,一般較大的重作日誌緩衝區能減小重作日誌文件的對 I/O 的讀寫次數,對數據庫的總體性能有必定的提升。
共享池是 SGA 保留的內存區域,用於緩存 SQL 語句、PL/SQL語句、數據字典、資源鎖、字符集以及其餘控制結構等。共享池包含高速緩衝區(Library cache )和字典高速緩衝區(Dictionary cache)。
(1)庫高速緩衝區時共享池的一部分,主要包括共享 SQL區和私有 SQL區兩個組成部分。庫高速緩衝區中存放最近用過的 SQL 語句、PL/SQL 語句的文本和執行計劃。當下一次執行相同的 SQL 語句或 PL/SQL 語句時,能夠直接在庫高速緩衝區中找到以前已經生成的執行計劃,而不須要再次解析相同的 SQL 語句或 PL/SQL 語句,從而提升系統執行效率。
每條被緩存的SQL 或 PL/SQL 語句都被分紅兩個部分,分別被存放在共享 SQL 區和私有 SQL 區中。共享 SQL區存放 SQL或 PL/SQL 語句的語法分析結果和執行計劃,若是之後要再次執行相似的語句,則能夠利用共享 SQL 區中已緩存的語法分析結果和執行計劃。私有 SQL 區存放SQL 語句中的綁定變量、環境和會話等信息,這些信息屬於執行該語句的用戶的私有信息,其餘用戶則沒法共享這些信息。
(2)字典高速緩衝區用於存放 Oracle 系統內部管理所須要的數據字典信息,例如用戶名、數據對象和權限等。
共享池的內存空間大小是能夠動態改變的,通常經過修改參數 SHARED_POOL_SIZE 的值來實現。
大型池在 SGA 區中不是必須的內存結構,只在某些特殊狀況下,實例須要使用大型池來減輕共享池的訪問壓力,經常使用的狀況有如下幾種:
大型池的緩存區大小是經過 Large_pool_size參數定義的,在 Oracle 11g中,用戶可使用 alter system 命令動態地修改其緩衝區的大小。
用來提供內存空間給 Java 虛擬機使用,目的是支持在數據庫中運行 Java 程序包,其大小由 Java_Pool_size 參數決定
Oracle 流池用於在數據庫與數據庫之間進行信息共享。若是沒有用到 Oracle 流,就不須要設置該池。流池的大小由參數 STREAMS_Pool_size 決定。
程序全局區(Program Global Area)也可稱作用戶進程全局區,它的內存在進程私有區而不是共享區。雖然 PGA 是一個全局區,能夠把代碼,全局變量和數據結構均可以存放在其中,但區域內的資源並不像 SGA 同樣被全部的用戶進程所共享,而是每一個 Oracle 服務器進程都只擁有屬於本身的那部分 PGA資源。
在程序全局區(PGA)中,一個服務進程只能訪問屬於它本身的那部分 PGA 資源區,各個服務進程的 PGA 區總和即爲實例 PGA區的大小。一般 PGA 區由私有 SQL 區和會話區組成。
私有 SQL 區用於存儲變量以及 SQL 語句運行時的內存結構信息,當每一個用戶鏈接到實例時,都會在實例中建立一個會話。這些會話可能會在 SGA 區中建立一個共享 SQL區,但在 PGA 區中可能會建立多個私有 SQL 區。把一個私有 SQL 區與對應的共享 SQL 區合併在一塊兒,就能夠得到一條 SQL語句的完整緩存數據。
每一個會話的私有 SQL 區能夠再分爲靜態區和動態區兩部分。靜態區的信息在會話過程當中保持不變,只有當會話結束時,靜態區纔會被釋放掉;而動態區的信息在整個會話過程當中是不斷變化的,一旦 SQL 語句指定完畢,即便會話尚未結束,動態區也被釋放掉。
會話區用於存放用戶的會話信息(如登陸用戶名)。若是數據庫處於共享服務器鏈接模式下,則會話區將位於 SGA 區域,而不是 PGA 中。
查看程序全局區(PGA)的信息能夠經過顯示 pga 參數的內容來實現。
前臺進程包括用戶進程和服務進程,它不屬於實例的一部分,可是用戶在不知不覺中常常會用到它,使用前臺進程可以實現用戶與實例的溝通。
用戶進程是指那些可以產生或執行 SQL 語句的應用程序,不管是 SQL*Plus,仍是其餘應用程序,只要是能生成或執行 SQL 語句,都被稱做用戶進程。
在用戶進程中有兩個很是重要的概念:鏈接和會話。鏈接是一個用戶進程與實例之間創建的通訊渠道,這個渠道能夠經過操做系統上的相關通訊機制或網絡鏈接來實現。會話是指用戶進程與實例之間創建鏈接後造成的用戶與實例之間的交互方式,通常是用戶發出請求,數據庫實例爲用戶返回響應消息的方式。
服務進程就是用於處理用戶會話過程當中向數據庫實例發出 SQL 語句或 SQL*Plus 命令,它能夠分爲專用服務器模式和共享服務器模式。在專用服務器模式下,每一個用戶進程都有一個專用的服務器進程,這個服務器進程表明用戶進程執行 SQL 語句,必要時還能夠回傳執行結果給用戶進程。在共享服務器模式下,每一個用戶進程不直接與服務器進程鏈接,而是鏈接到分派程序,每一個分派程序能夠同時鏈接多個用戶進程。
Oracle 後臺進程是一組運行與 Oracle 服務器端的後臺程序,是 Oracle 實例的重要組成部分。這組後臺進程有若干個,它們分工明確——分別完成不一樣的系統程序。
其中 SMON、PMON、DBWR、LGWR 和 CKRT 這5哥後臺進程必須正常啓動,不然將致使數據庫崩潰。還有不少的輔助進程,用於實現相關的輔助功能,若是這些輔助進程發生問題,只會使某些功能受到影響,通常不會到時數據庫實例崩潰。
數據寫入進程的主要任務是負責將內存中的 「髒」 數據塊回寫到數據文件中。「髒」 數據塊是指高速數據緩衝區中的被修改過的數據塊,這些數據塊的內容與數據文件內容不一致。但 DBWR 並非隨時將全部的 「髒」 數據塊都寫入數據文件,只有知足必定的條件時, DBWR 進程纔開始成批量地將 「髒」 數據寫入數據文件, Oracle 這樣作的目的是爲了儘可能減小 I/O 操做,提供 Oracle 服務器性能。一般在下面幾種狀況下,DBWR 進程將 「髒」 數據塊寫入數據文件。
在某些比較繁忙的應用系統中,能夠修改服務器參數文件 Spfile 的 DB_writer_processes 參數,以容許使用多個 DBWR 進程。可是 DBWR 進程的數量不該當超過系統處理器的數量,不然多餘的 DBWR 不但沒法發揮做用,反而會耗費系統資源。
檢查點進程能夠看作義工事件,當檢查點事件發生時, CKPT 會要求 DBWR將某些 「髒」 數據塊回寫到數據文件。當用戶進程發出數據請求時, Oracle 系統從數據文件中讀取須要的數據並存放到高速數據緩衝區,用戶對數據的操做時在緩衝區中進行的。當用戶操做數據時,就會產生大量的日誌信息並存儲在崇左日誌緩衝區,當 Oracle 系統知足必定條件時,日誌寫入常常(LGWR)會將日誌信息寫入到崇左日誌文件組中,當發生日誌切換時(寫入操做正要從一個日誌文件組切換到另外一組時),就會啓動檢查點進程。
DBA 還能夠經過修改初始化參數 spfile 中的 checkpoint_process 參數爲TRUE來啓動檢查點進程。
日誌寫入進程用於將重作日誌緩衝區中的數據寫入重作日誌文件。Oracle 系統首先將用戶所作的修改日誌信息寫入日誌文件,而後再將修改結果寫入數據文件。
Oracle 實例再運行中會產生大量日誌信息,這些日誌信息首先被記錄在 SGA 的重作日誌緩衝區中,當發生提交命令、或者重作日誌緩衝區的信息滿 1/3 ,或者日誌信息存放超過3秒鐘時,LGWR 進程就將日誌信息從重作日誌緩衝區中讀出並寫入日誌文件組中序號較小的文件中,一個日誌組寫滿後接着寫另一組。當 LGWR 進程將全部的日誌文件都寫過一遍後,它將再次轉向第一個日誌文件組從新覆蓋。當 LGWR 進程寫滿一個日誌文件組而轉向寫另一組時,稱之爲日誌切換。
歸檔進程是一個可選擇的進程,只有當 Oracle 數據庫處於歸檔模式時,該進程纔可能起到做用。若 Oracle 數據庫處於歸檔模式,當各個日誌文件組都被寫滿而即將被覆蓋以前,先由歸檔進程(ARCH)把即將被覆蓋的日誌文件中的日誌信息讀出,而後再把這些 「讀出的日誌信息」 寫入到歸檔日誌文件中。
當系統比較繁忙而致使 LGWR 進程處於等待 ARCH 進程時,可經過修改 LOG_Archive_max_processes 參數啓動多個歸檔進程,從而提升歸檔寫磁盤的速度。
系統監控進程時在數據庫系統啓動時恢復工做的強制性進程。例如:在並行服務器模式下,SMON 能夠恢復另外一個處於失敗的數據庫,使系統切換到另一臺正常的服務器上。
進程監控進程用於監控其餘進程的狀態,當有進程啓動失敗時,PMON 會清除失敗的用戶進程,釋放用戶進程所用的資源。
這個一個可選進程,並行服務器模式下能夠出現過個鎖定進程以利用與數據庫通訊。
這是在分佈式數據庫模式下使用的一個可選進程,用於數據不一致時進行恢復工做。
這是一個可選進程,在共享服務器模式下使用,能夠啓動多個調度進程。
快照進程用於處理數據庫快照的自動刷新,並經過 DBMS_job 包運行預約的數據庫存儲過程。