天天看點

Oracle記憶體結構與執行個體及其管理

Oracle記憶體結構與執行個體及其管理

1、 記憶體結構:

Oracle資料庫的總體結構如下圖:

每個Oracle資料庫都是由Oracle Instance(執行個體)與資料庫(資料檔案,控制檔案、重做日志檔案)組成,其中所謂執行個體就是使用者同資料庫互動的媒介,使用者通過于一個執行個體相連來操作資料庫。而執行個體又是由統一的記憶體結構(SGA,PGA,UGA)和一批記憶體駐留程序組成。執行個體在作業系統中用ORACLE_SID來辨別,在Oracle中用參數INSTANCE_NAME來辨別, 它們兩個的值是相同的。資料庫啟動時,系統首先在伺服器記憶體中配置設定系統全局區(SGA), 構成了Oracle的記憶體結構,然後啟動若幹個常駐記憶體的作業系統程序,即組成了Oracle的 程序結構,記憶體區域和背景程序合稱為一個Oracle執行個體。

執行個體結構如下圖:

1.1記憶體對資料庫的影響:

記憶體是影響資料庫性能的重要因素,Oracle8i使用靜态記憶體管理,Oracle 10g使用動态 記憶體管理。所謂靜态記憶體管理,就是在資料庫系統中,無論是否有使用者連接配接,也無論并發用 量大小,隻要資料庫服務在運作,就會配置設定固定大小的記憶體;動态記憶體管理允許在資料庫服 務運作時對記憶體的大小進行修改,讀取大資料塊時使用大記憶體,小資料塊時使用小記憶體,讀 取标準記憶體塊時使用标準記憶體設定。

1.2 SGA内部結構及管理:

SGA是一組為系統配置設定的共享的記憶體結構,可以包含一個資料庫執行個體的資料或控制信 息。如果多個使用者連接配接到同一個資料庫執行個體,在執行個體的SGA中,資料可以被多個使用者共享。 當資料庫執行個體啟動時,SGA的記憶體被自動配置設定;當資料庫執行個體關閉時,SGA記憶體被回收。 SGA是占用記憶體最大的一個區域,同時也是影響資料庫性能的重要因素。

通過下面的語句查詢

SQL> show parameter sga NAME

TYPE VALUE ------------------------------------ ----------- --------

lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 164M sga_target big integer 0

其中:sga_max_size的大小是不可以動态調整的。

如:

SQL> alter system set sga_max_size=100m;

alter system set sga_max_size=100m

* ERROR at line 1: ORA-02095: specified initialization parameter cannot be modified

系統全局區按作用不同可以分為: •資料緩沖區 •日志緩沖區 •共享池 •大池 •Java池

其中後兩項為可選項。

1.2.1 資料緩沖區(Database Buffer Cache) 如果每次執行一個操作時,Oracle都必須從磁盤讀取所有資料塊并在改變它之後又必須把每一塊寫入磁盤,顯然效率會非常低。資料緩沖區存放需要經常通路的資料,供所有使用者使用。修改資料時,首先從資料檔案中取出資料,存儲在資料緩沖區中,修改/插入資料也存儲在緩沖區中,commit或DBWR(下面有詳細介紹)程序的其他條件引發時,資料被寫入資料檔案。資料緩沖區的大小是可以動态調整的,但是不能超過sga_max_size的限制。

通過下面的語句查詢

SQL> show parameter db_cache_size

NAME TYPE VALUE ------------------------------------ ----------- ----------------- db_cache_size big integer 24M

修改資料緩沖區大小:

SQL> alter system set db_cache_size=20m;

System altered.

#下面語句可以用來檢視記憶體空間配置設定情況,注意SGA各區大小總和。 SQL> select name,value from v$parameter where name like '%size' and value <> '0';

SGA區的其他部分都可以修改,緻使不能超過sga_max_size限制,如使用下面語句修改Java池大小

SQL> alter system set java_pool_size=20m; System altered.

資料緩沖區的大小對資料庫的存取速度有直接影響,多使用者時尤為明顯。有些應 用對速度要求很高,一般要求資料緩沖區的命中率在90%以上。

下面給出一種計算資料緩沖區命中率的方法:

•使用資料字典v$sysstat ===================================================================

SQL> select name, value from v$sysstat

2 where name in('session logical reads',

3 'physical reads',

4 'physical reads direct',

5 'physical reads direct (lob)')

NAME VALUE ------------------------------- ----------

session logical reads 895243

physical reads 14992

physical reads direct 34

physical reads direct (lob) 0 ===================================================================

命中率=1-(14992-34-0)/895243

可以讓Oracle給出資料緩沖區大小的建議: ===================================================================

SQL> alter system set db_cache_advice=on;#打開該功能 System altered.

SQL> alter system set db_cache_advice=off;#關閉該功能 System altered.

1.2.2:日志緩沖區(Log Buffer Cache) 日志緩沖區用來存儲資料庫的修改資訊。該區對資料庫性能的影響很小。

查詢日志緩沖區大小:

SQL> show parameter log_buffer

NAME TYPE VALUE ---------- ----------- -------

log_buffer integer 262144

1.2.3:共享池(Share Pool) 共享池是對SQL,PL/SQL程式進行文法分析,編譯,執行的記憶體區域。

它包含三個部分: •庫緩沖區(Library Cache)包含SQL,PL/SQL語句的分析碼,執行計劃。 •資料字典緩沖區(Data Dictionary Cache)表,列定義,權限。 •使用者全局區(Usr Global Area)使用者MTS會話資訊。

這三個部分都不可單獨定義大小,必須通過share pool間接定義 共享池的大小可以動态修改: ===================================================================

SQL> show parameter shared_pool_size

NAME TYPE VALUE ------------------------------------ ----------- ------ __

shared_pool_size big integer 80M

shared_pool_size big integer 80M

SQL> alter system set shared_pool_size=78m

System altered.

2、 程式全局區PGA(Programe Global Area)

程式全局區是包含單個使用者或伺服器資料和控制資訊的記憶體區域,它是在使用者程序連接配接到Oracle并建立一個會話時由Oracle自動配置設定的。PGA包含的是有關程序正在使用的作業系統資源資訊以及程序的狀态資訊,而其它的程序所使用的Oracle的共享資源是在SGA中。PGA是私有的而不是共享的,這個機制是有必要的,因為當程序死掉後可以把這些資源清除和釋放掉。另外PGA的結構同Oracle運作的模式有關,Oracle在專有伺服器(Dedicated Server)和共享伺服器(Shared Server)兩種運作模式下,PGA的結構是有差别的。如下圖所示:

如上圖:

•Stack Space是用來存儲使用者會話變量和數組的存儲區域;

•User Session Data是為使用者會話使用的附加存儲區。

|--Session Information

|--Sort Area

|--Cursor Information

注意Session information(使用者會話資訊)在獨占伺服器中與在共享伺服器中所處的記憶體區域是不同的。

3、排序區,大池,Java池

排序區(Sort Area)為有排序要求的SQL語句提供記憶體空間。系統使用專用的記憶體區 域進行資料排序,這部分空間就是排序區。在Oracle資料庫中,使用者資料的排序可使用 兩個區域,一個是記憶體排序區,一個是磁盤臨時段,系統優先使用記憶體排序區進行排序。 如果記憶體不夠,Orcle自動使用磁盤臨時表空間進行排序。為提高資料排序的速度,建議 盡量使用記憶體排序區,而不要使用臨時段。 參數sort_area_size用來設定排序區大小。

大池(Large Pool)用于資料庫備份工具--恢複管理器(RMAN:Recovery Manager)。 Large Pool的大小由large_pool_size确定,可用下面語句查詢和修改: =========================================================================

SQL> show parameter large_pool_size

NAME TYPE VALUE ----------------- ----------- -------

large_pool_size big integer 8M

SQL> alter system set large_pool_size=7m;

System altered. =========================================================================

Java池主要用于Java語言開發,一般來說不低于20M。其大小由java_pool_size來 确定,可以動态調整。

4、Oracle自動共享記憶體管理(Automatic Shared Memory(SGA) Management) 在Oracle 8i/9i中資料庫管理者必須手動調整SGA各區的各個參數取值,每個區要根據負荷輕重分别設定,如果設定不當,比如當某個區負荷增大時,沒有調整該區記憶體大小,則可能出現ORA-4031:unable to allocate ...bytes of shared memory錯誤。在Oracle 10g中,将參數STATISTICS_LEVEL設定為TYPICAL/ALL,使用SGA_TARGET指定SGA區總大小,資料庫會根據需要在各個元件之間自動配置設定記憶體大小。

注意:如果不設定SGA_TARGET,則自動共享記憶體管理功能被禁止。

5、Oracle執行個體的程序結構(Process Structure) Oracle包含三類程序: •使用者程序(User Process) •伺服器程序(Server Process) •背景程序(Background Process)

5.1使用者程序和伺服器程序 當資料庫使用者請求連接配接到Oracle的服務時啟動使用者程序(比如啟動SQLPlus時)。 •使用者程序首先必須建立一個連接配接。 •使用者不能直接與Oracle伺服器,必須通過伺服器程序互動。(這個過程主要通過Oracle的監聽程序Listener實作) •伺服器程序是使用者程序與伺服器互動的橋梁,它可以與Oracle Server直接互動。 •伺服器程序可以有共享和獨占兩種形式。

5.2 背景程序(Backgroung Process) 資料庫的實體結構與記憶體結構之間的互動要通過背景程序來完成。資料庫的背景程序包含兩類,一類是必須的,一類是可選的:

•Mandatory background processes

|--DBWn(Database Writer):資料寫入

|--PMON(Process Moniter):程序監控

|--LGWR(Log Writer):日志寫入

|--SMON(System Moniter):系統監控

|--RECO(Recovery):恢複

|--CKPT(Chekpoint):檢查點

•Optional background processes

|--ARCn(Archiver):歸檔程序

|--LCKn(Lock):鎖程序

|--Dnnn(Dispatcher):排程程序

|--...... 可以用下面的語句檢視正在運作的背景程序: =========================================================================

SQL> select * from v$bgprocess where paddr<>'00';

PADDR PSERIAL# NAME DESCRIPTION -------- ---------- ----- ------------------------------- 6B0ED064 1 PMON process cleanup 6B0ED4E4 1 MMAN Memory Manager 6B0ED964 1 DBW0 db writer process 0 6B0EDDE4 1 LGWR Redo etc. 6B0EE264 1 CKPT checkpoint 6B0EE6E4 1 SMON System Monitor Process 6B0EEB64 1 RECO distributed recovery 6B0EEFE4 1 CJQ0 Job Queue Coordinator 6B0F01E4 1 QMNC AQ Coordinator 6B0F0664 1 MMON Manageability Monitor Process 6 B0F0AE4 1 MMNL Manageability Monitor Process 2 =========================================================================

5.2.1 DBWR(Database Writer,資料寫入程序) 将資料緩沖區的資料寫入資料檔案,是負責資料緩沖區管理的一個背景程序。當資料緩沖區中的一資料被修改後,就标記為dirty,DBWR程序将資料緩沖區中“髒”資料寫入資料檔案,保持資料緩沖區的”幹淨“。由于資料緩沖區的資料被使用者修改并占 用,空閑資料緩沖區會不斷減少,當使用者程序要從磁盤讀取資料塊到資料緩沖區卻無法找到足夠的空閑資料緩沖區時,DBWR将資料緩沖區内容寫入磁盤,使使用者程序總可以得到足夠的空閑資料緩沖區。

DBWR的作用: •管理資料緩沖區,以便使用者程序總能夠找到足夠的空閑緩沖區。 •将所有修改後的緩沖區資料寫入資料檔案。 •使用LRU(最近最少使用)算法保持緩沖區資料是最近經常使用的。 •通過延遲寫來優化磁盤I/0讀寫。

5.2.2 LGWR(Log Writer,日志寫入程序) 将日志資料從日志緩沖區寫入磁盤日志檔案組。資料庫在運作時,如果對資料庫進行修改則産生日志資訊,日志資訊首先産生于日志緩沖區。當日志達到一定數量時,由LGWR将日志資料寫入到日志檔案組,再經過日志切換,由歸檔程序(ARCH)将日志資料寫入歸檔程序(前提是資料庫運作在歸檔模式下)。資料庫遵循寫日志優先原則,即在寫資料之前先寫日志。

5.2.3其他程序簡單介紹 •ARCH(Archive,歸檔程序) Oracle資料庫有兩種運作模式,歸檔(ARCHIVELOG),非歸檔(NOARCHIVELOG)模式。 以非歸檔模式運作時日志在切換時被直接覆寫,不産生歸檔日志,這是資料庫預設的運作模式。資料庫運作在歸檔模式時,在日志切換之前,由ARCH程序将線上日志資訊寫入歸檔目的地,該目的地可以是本地磁盤,也可以使可以是網絡能通路到的遠端存儲媒體(如錄音帶庫)。 Oracle資料庫的Redo檔案數量是有限的,是以Oracle以循環的方式向它們中寫入。它順序寫滿每一個Redo檔案,當達到最後一個時,再循環回去開始填寫第一個Redo檔案。如果為了能恢複資料庫而想儲存日志檔案,那麼在它們被重新使用之前需要對其進行備份,歸檔程管理此工作。

•CKPT(Check Point,檢查點程序) 運作CKPT時,系統對全部資料檔案及控制檔案檔案頭的同步信号進行修改,以保證資料庫的同步。檢查點出現在以下情況:

|--在每個日志切換時産生。

|--上一個檢驗點之後又經過了指定時間。

|--從上一個檢驗點之後,當預定義數量的日志塊被寫入磁盤之後。

|--資料庫關閉。

|--DBA強制産生。

|--當表空間設定為OFFLINE時。

•SMON(System Moniter,系統監控程序) SMON在執行個體啟動時執行執行個體恢複,并負責清理不再使用的臨時段。

•PMON(Process Monitor,程序監控) PMON在使用者程序出現故障時進行恢複,負責清理記憶體區域和釋放該程序所使用的資源。

•RECO(Recovery,恢複程序) RECO用于分布式資料庫維持在分布式環境中的資料的一緻性。

•LCKn(Lock,鎖程序) 在并行伺服器中用于多個執行個體間的封鎖。

•Dnnn(Dispatcher,排程程序) Dnnn存在于多線程伺服器體系結構中(Shared Server),負責将使用者程序連接配接到伺服器程序,再把結果傳回給使用者程序。