-------聲明:本文參考了Oracle官方文檔和網際網路的海量資訊,并歸納總結而來。如有錯誤之處,還請各位不吝賜教。
Oracle 伺服器是一個資料庫管理系統,它提供了一種開放、全面、內建的方法來管理資訊。
Oracle 伺服器的關鍵是管理資訊。其主要性能有以下幾個方面:
開放式聯接、開發工具、空間管理、備份與恢複、海量資料管理、保密機制、決策支援系統
<b>Oracle</b><b>資料庫體系結構</b><b></b>
<b>Oracle</b><b>伺服器由</b><b> Oracle </b><b>執行個體和</b><b> Oracle </b><b>資料庫組成,</b>如圖所示:
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855051dRLg.jpg"></a>
簡易表示為下圖所示:
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855054QSXW.jpg"></a>
每一個Oracle 資料庫都關聯着一個 Oracle 執行個體。在資料庫伺服器上啟動資料庫後,Oracle 軟體會配置設定一個稱為系統全局區(SGA) 的共享記憶體區,還會啟動若幹個 Oracle 背景程序。這種 SGA 和Oracle 程序的組合就稱為一個 Oracle 執行個體。
執行個體啟動後,Oracle 軟體會将執行個體與特定的資料庫關聯起來。這個過程稱為裝載資料庫。接下來就可以打開資料庫了。在同一台Oracle伺服器上可以并發執行多個執行個體,每一個執行個體隻通路自己的實體資料庫。Oracle 資料庫使用記憶體結構和程序來管理、通路資料庫。所有記憶體結構都存在于構成資料庫伺服器的計算機的主存中。
程序指的是在這些計算機記憶體中運作的作業。程序被定義為“控制線程”或作業系統中可以運作一系列步驟的機制。
可以将 Oracle 資料庫體系結構看作多種不同的、互相關聯的結構化元件。
接下來就介紹一下執行個體的相關内容:
<b>Oracle</b><b>執行個體有程序和記憶體組成。</b><b></b>
先來說一下程序結構,下圖是Oracle程序結構。
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855056belw.jpg"></a>
Oracle程序可以分為以下三種:
背景程序:在啟動 Oracle 執行個體時啟動。系統為了使性能最好和協調多個使用者,在多程序系統中使用一些附加程序,統稱為背景程序。在許多作業系統中,一個ORACLE執行個體可以有許多背景程序,但它們不是一直存在。
使用者程序:在資料庫使用者請求連接配接到 Oracle 伺服器時啟動。負責将用戶端使用者的SQL語句傳遞給服務程序,并從伺服器端拿回查詢資料。
伺服器程序:可以連接配接到 Oracle 執行個體,它在使用者建立會話時啟動。伺服器程序用于處理連接配接到該執行個體的使用者程序的請求。有以下兩種情況:
1、當使用者和ORACELE資料庫是在同一台機器上運作,而不再通過網絡,一般将使用者程序和它相應的伺服器程序組合成單個的程序,可降低系統開銷。 2、當使用者和ORACLE資料庫運作在不同的機器上時,使用者程序經過一個分離伺服器程序與ORACLE通信。它可執行下列任務:對應用所發出的SQL語句進行文法分析和執行。從磁盤(資料檔案)中讀入必要的資料塊到SGA的共享資料庫緩沖區(該塊不在緩沖區時)。将結果傳回給應用程式處理。
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855059lB4y.jpg"></a>
<b></b>
<b>Oracle</b><b>的背景程序:</b><b></b>
Oracle的背景程序比較重要的包括以下幾個:
SMON PMON DBWRn LGWR ARCHn CKPT
在Linux上可以通過如下方法檢視背景程序:
指令為:ps -ef | grep ora_
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855073OKH3.jpg"></a>
SMON(系統監護程序):在執行個體啟動時執行執行個體恢複,并負責清理不再使用的臨時段。SMON程序要完成所有“系統級”任務。PMON感興趣的是單個的程序,而SMON與之不同,它以系統級為出發點,這是一種資料庫“垃圾收集器”。SMON所做的工作包括:
·清理臨時空間
·合并空閑空間
·針對原來不可用的檔案恢複活動的事務
·執行RAC中失敗節點的執行個體恢複
·清理OBJ$
·收縮復原段
·“離線”復原段
PMON(使用者程序監護程序):背景程序清除失敗使用者的程序,釋放使用者當時正在使用的資源。PMON負責釋放鎖并使其可以被其他使用者使用。同SMON一樣,PMON周期性地喚醒檢測它是否需要被使用。負責在出現異常中止的連接配接之後完成清理-釋放資源,復原未送出的事務工作。還負責監視其他的Oracle背景程序,并在必要時重新開機這些背景程序。另外,PMON還會為執行個體做另外一件事,這就是向Oracle TNS監聽器注冊這個執行個體。
DBWR(資料檔案寫入程序):負責将更改的資料從資料庫緩沖區高速緩存寫入資料檔案,是負責緩沖存儲區管理的一個ORACLE背景程序。當緩沖區中的一緩沖區被修改,它被标志為“弄髒”,DBWR的主要任務是将“弄髒”的緩沖區寫入磁盤,使緩沖區保持“幹淨”。由于緩沖存儲區的緩沖區填入資料庫或被使用者程序弄髒,未用的緩沖區的數目減少。當未用的緩沖區下降到很少,以緻使用者程序要從磁盤讀入塊到記憶體存儲區時無法找到未用的緩沖區時,DBWR将管理緩沖存儲區,使使用者程序總可得到未用的緩沖區。ORACLE采用LRU(LEAST RECENTLY USED)算法(最近最少使用算法)保持記憶體中的資料塊是最近使用的,使I/O最小。
下列情況預示DBWR 要将弄髒的緩沖區寫入磁盤:
1、當一個伺服器程序将一緩沖區移入“髒”表,該髒表達到臨界長度 時,該服務程序将通知DBWR進行寫。該臨界長度是為參數DB-BLOCK-WRITE-BATCH 的值的一半。
2、 當一個伺服器程序在LRU表中查找DB-BLOCK-MAX-SCAN-CNT緩沖區時,沒有查到未用的緩沖區,它停止查找并通知DBWR進行寫。
3、出現逾時(每次3秒),DBWR 将通知本身。
4、 當出現檢查點時,LGWR将通知DBWR
在前兩種情況下,DBWR将髒表中的塊寫入磁盤,每次可寫的塊數由初始化參數 DB-BLOCK-WRITE-BATCH所指定。如果髒表中沒有該參數指定塊數的緩沖區,DB WR從LUR表中查找另外一個髒緩沖區。
如果DBWR在三秒内未活動,則出現逾時。在這種情況下DBWR對LRU表查找指定數目的緩沖區,将所找到任何髒緩沖區寫入磁盤。每當出現逾時,DBWR查找一個新的緩沖區組。每次由DBWR查找的緩沖區的數目是為寝化參數DB-BLOCK-WRITE-BATCH的值的二倍。如果資料庫空運轉,DBWR最終将全部緩沖區存儲區寫入磁盤。在出現檢查點時,LGWR指定修改緩沖區表必須寫入到磁盤。
LGWR(日志檔案寫入程序):該程序将日志緩沖區寫入磁盤上的一個日志檔案,它是負責管理日志緩沖區的一個ORACLE背景程序。LGWR程序将自上次寫入磁盤以來的全部日志項輸出,LGWR輸出:
1、 當使用者程序送出一事務時寫入一個送出記錄。 2、每三秒将日志緩沖區輸出。 3、當日志緩沖區的1/3已滿時将日志緩沖區輸出。 4、有大于1M 重做日志緩沖區未被寫入磁盤 5、逾時
LGWR程序同步地寫入到活動的線上從做日志檔案組。如果組中一個檔案被删除或不可用,LGWR 可繼續地寫入該組的其它檔案。由于日志緩沖區是一個循環緩沖區。當LGWR将日志緩沖區的日志項寫入日志檔案後,伺服器程序可将新的日志項寫入到該日志緩沖區。LGWR 通常寫得很快,可確定日志緩沖區總有空間可寫入新的日志項。
【注意:】有時候當需要更多的日志緩沖區時,LWGR在一個事務送出前就将日志項寫出,而這些日志項僅當在以後事務送出後才永久化。ORACLE使用快速送出機制,當使用者發出COMMIT語句時,一個送出(COMMIT)記錄立即放入日志緩沖區,但相應的資料緩沖區改變是被延遲,直到在更有效時才将它們寫入資料檔案。當一個事務送出時,被賦給一個系統修改号(SCN),它同僚務日志項一
起記錄在日志中。由于SCN記錄在日志中,以緻在并行伺服器選項配置情況下,恢複操作可以同步。
CKPT(檢查點程序,同步資料檔案, 日志檔案,控制檔案):該程序在檢查點出現時,對全部資料檔案的标題進行修改,訓示該檢查點。在通常的情況下,該任務由LGWR執行。然而,如果檢查點明顯地降低系統性能時,可使CKPT程序運作,将原來由LGWR程序執行的檢查點的工作分離出來,由CKPT程序實作。對于許多應用情況,CKPT程序是不必要的。隻有當資料庫有許多資料檔案,LGWR在檢查點時明顯地降低性能才使CKPT運作。CKPT程序不将塊寫入磁盤,該工作是由DBWR完成的。初始化參數CHECKPOINT-PROCESS控制CKPT程序的使能或使不能。預設時為FALSE。
ARCH(歸檔程序):該程序将已填滿的線上日志檔案拷貝到指定的儲存設備。當日志是為ARCHIVELOG使用方式、并可自動地歸檔時ARCH程序才存在。
LCKn(封鎖程序):是在具有并行伺服器選件環境下使用,可多至10個程序(LCK0,LCK1 ……,LCK9),用于執行個體間的封鎖。
其他還有一些不是很重要的程序:
RECO 恢複
Dnnn 排程程序
Snnn 伺服器
但是每個背景程序都與ORACLE資料庫的不同部分進行互動。
<b>服務程序</b><b>Server Process</b>
可以分為專用伺服器程序和共享伺服器程序。
專用服務程序(Dedicated Server Process):一個服務程序對應一個使用者程序
共享服務程序(MultiTreaded Server Process):一個服務程序對應多個使用者程序,輪流為使用者程序服務。
專用伺服器模式就是說每次在對Oracle進行通路的時候,Oracle伺服器的Listener會得到這個通路請求,然後會為這個通路建立一個新的程序來進行服務。是以說,對于每一個用戶端的通路,都會生成一個新的程序進行服務,是一種類似一對一的映射關系。這種連接配接模式的一個很重要的特點就是UGA(使用者全局區)是存儲在PGA(程序全局域)中的,這個特性也很好說明了目前使用者的記憶體空間是按照程序來進行配置設定的。
共享伺服器連接配接則是在資料庫的初始化的時候就會建立一批伺服器連接配接的程序,然後把這些連接配接程序放入一個連接配接池來進行管理。初始化的池中的程序數量在資料庫初始化建立的時候是可以手動設定的。在連接配接建立的時候,Listener首先接受到用戶端的建立連接配接的請求,然後Listener去生成一個叫做排程器(dipatcher)的程序與用戶端進行連接配接。
接着來說一下記憶體結構,下圖是Oracle記憶體結構。
<a href="http://linuxtro.blog.51cto.com/attachment/201003/29/1239505_1269855078xXhw.jpg"></a>
與 Oracle 執行個體關聯的基本記憶體結構包括:
系統全局區 (SGA):由所有伺服器程序和背景程序共享
程式全局區 (PGA):專用于每一個伺服器程序或背景程序。每一個 程序使用一個 PGA
<b>系統全局共享區</b><b>System Global Area(SGA)</b>
SGA是一塊巨大的共享記憶體區域,是包含執行個體的資料和控制資訊的記憶體區。他被看做是Oracle 資料庫的一個大緩沖池,這裡的資料可以被ORACLE的各個程序共用。其大小可以通過如下語句檢視:
SQL&gt; select * from v$sga;
NAME VALUE
-------------------- -------------------------------
Fixed Size 1218992
Variable Size 96470608
Database Buffers 184549376
Redo Buffers 2973696
SQL&gt; select * from v$sgastat;
…………
POOL NAME BYTES
------------ -------------------------- ------------------------------------
large pool PX msg pool 206208
large pool free memory 3988096
java pool free memory 4194304
608 rows selected.
SGA 包含以下資料結構:
資料庫緩沖區高速緩存(Database buffer cache):緩存從資料庫檢索的資料塊。這些緩沖是對應所有資料檔案中的一些被使用到的資料塊。讓他們能夠在記憶體中進行操作。在這個級别裡沒有系統檔案,,使用者資料檔案,臨時資料檔案,復原段檔案之分。也就是任何檔案的資料塊都有可能被緩沖。資料庫的任何修改都在該緩沖裡完成,并由DBWR程序将修改後的資料寫入磁盤。
重做日志緩沖區(Redo log buffer):高速緩存重做資訊(用于執行個體恢複),直到可以将其寫入磁盤中存儲的實體重做日志檔案。對資料庫的任何修改都按順序被記錄在該緩沖,然後由LGWR程序将它寫入磁盤。這些修改資訊可能是DML語句,如(Insert,Update,Delete),或DDL語句,如(Create,Alter,Drop等)。 重做日志緩沖區的存在是因為記憶體到記憶體的操作比較記憶體到硬碟的速度快很多,是以重作日志緩沖區可以加快資料庫的操作速度,但是考慮的資料庫的一緻性與可恢複性,資料在重做日志緩沖區中的滞留時間不會很長。是以重作日志緩沖區一般都很小,大于3M之後的重作日志緩沖區已經沒有太大的實際意義。
共享池(Shared pool):緩存可在使用者間共享的各個結構。共享池是SGA中最關鍵的記憶體片段,特别是在性能和可伸縮性上。一個太小的共享池會扼殺性能,使系統停止,太大的共享池也會有同樣的效果,将會消耗大量的CPU來管理這個共享池。不正确的使用共享池隻會帶來災難。
大池(Large Pool):是一個可選區域,可為某些大型程序(如 Oracle 備份和恢複操作、I/O 伺服器程序)提供大量記憶體配置設定。大池并不是因為大而得名,而是因為它用來配置設定較大的記憶體,處理比共享池更大的記憶體。從Oracle8i開始引用。
Java 池:用于 Java 虛拟機 (JVM) 中特定會話的所有Java 代碼和資料。 Oracle 8I 以後,Oracle 在核心中加入了對Java的支援。該程式緩沖區就是為Java 程式保留的。如果不用Java程式沒有必要改變該緩沖區的預設大小。
Streams 池:由 Oracle Streams 使用通過使用 Enterprise Manager 或SQL*Plus 啟動執行個體,可以顯示為SGA 配置設定的記憶體量。
程式全局區 (PGA) 是包含各個伺服器程序的資料及控制資訊的記憶體區。Oracle 伺服器程序為客戶機的請求提供服務。每個伺服器程序都有自己專用的PGA,這個 PGA 是在伺服器程序啟動時建立的。由該伺服器程序對PGA 進行獨占通路,隻能通過對 PGA 執行操作的Oracle 代碼對 PGA 進行讀寫通路。使用動态 SGA 基礎結構時,可以在不關閉執行個體的情況下,更改資料庫緩沖區高速緩存、共享池、大型池和 Java 池以及Streams 池的大小。
Oracle 資料庫使用初始化參數建立并配置記憶體結構。例如,SGA_TARGET 參數可指定
SGA 的總大小。如果SGA_TARGET 設定為 0,則會禁用“自動共享記憶體管理”。
本文轉自 linuxtro 51CTO部落格,原文連結:http://blog.51cto.com/linuxtro/289197,如需轉載請自行聯系原作者