oracle|進程|體系
(一)記憶體結構和進程結構 Oracle資料庫的總體結構如下圖:
1:Oracle執行個體(Instance)
在一個伺服器中,每一個啟動並執行Oracle資料庫都與一個資料庫執行個體相聯絡,執行個體是我們
訪問資料庫的手段。
執行個體在作業系統中用ORACLE_SID來標識,在Oracle中用參數INSTANCE_NAME來標識,
它們兩個的值是相同的。資料庫啟動時,系統首先在伺服器記憶體中分配系統全域區(SGA),
構成了Oracle的記憶體結構,然後啟動若干個常駐記憶體的作業系統進程,即組成了Oracle的
進程結構,記憶體地區和後台進程合稱為一個Oracle執行個體。
資料庫與執行個體之間是1對1/n的關係,在非並行的資料庫系統中每個Oracle資料庫與一個
執行個體相對應;在並行的資料庫系統中,一個資料庫會對應多個執行個體,同一時間使用者只與一個
執行個體相聯絡,當某一個執行個體出現故障時,其他執行個體自動服務,保證資料庫正常運行。在任何
情況下,每個執行個體都只可以對應一個資料庫。
2:Oracle 10g動態記憶體管理
記憶體是影響資料庫效能的重要因素,Oracle8i使用靜態記憶體管理,Oracle 10g使用動態
記憶體管理。所謂靜態記憶體管理,就是在資料庫系統中,無論是否有使用者串連,也無論並發用
量大小,只要資料庫服務在運行,就會分配固定大小的記憶體;動態記憶體管理允許在資料庫服
務運行時對記憶體的大小進行修改,讀取大資料區塊時使用大記憶體,小資料區塊時使用小記憶體,讀
取標準記憶體塊時使用標準記憶體設定。
按照系統對記憶體使用量方法的不同,Oracle資料庫的記憶體可以分為以下幾個部分:
•系統全域區:SGA(System Global Area)
•程式全域區:PGA(Programe Global Area)
•排序池:(Sort Area)
•大池:(Large Pool)
•Java池:(Java Pool)
2-1:系統全域區SGA(System Global Area)
SGA是一組為系統分配的共用的記憶體結構,可以包含一個資料庫執行個體的資料或控制信
息。如果多個使用者串連到同一個資料庫執行個體,在執行個體的SGA中,資料可以被多個使用者共用。
當資料庫執行個體啟動時,SGA的記憶體被自動分配;當資料庫執行個體關閉時,SGA記憶體被回收。
SGA是佔用記憶體最大的一個地區,同時也是影響資料庫效能的重要因素。
SGA的有關資訊可以通過下面的語句查詢,sga_max_size的大小是不可以動態調整的。
=====================================
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
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
======================================
系統全域區按作用不同可以分為:
•資料緩衝區
•日誌緩衝區
•共用池
2-1-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=128m;
alter system set db_cache_size=128m
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00384: Insufficient memory to grow cache
SQL> alter system set db_cache_size=20m;
System altered.
SQL> show parameter db_cache_size;
NAME TYPE VALUE
------------------------------------ ----------- -----------------
db_cache_size big integer 20M
#此處我僅增加了1M都不行?
SQL> alter system set db_cache_size=25m;
alter system set db_cache_size=25m
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00384: Insufficient memory to grow cache
#修改顯示格式,方便查看。
SQL> column name format a40 wrap
SQL> column value format a20 wrap
#下面語句可以用來查看記憶體空間分配情況,注意SGA各區大小總和。
SQL> select name,value from v$parameter where name like '%size' and value <> '0';
#先將java_pool_size調小,然後再修改db_cache_size
SQL> show parameter java_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- -----
java_pool_size big integer 48M
SQL> alter system set java_pool_size=20m;
System altered.
SQL> alter system set java_pool_size=30m;
System altered.
#上面說明SGA中各區大小總和不能超過sga_max_size。
=====================================
資料緩衝區的大小對資料庫的存區速度有直接影響,多使用者時尤為明顯。有些應
用對速度要求很高,一般要求資料緩衝區的命中率在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.
======================================
2-1-2:日誌緩衝區(Log Buffer Cache)
日誌緩衝區用來儲存資料庫的修改資訊。該區對資料庫效能的影響很小,有關日
志後面還會有詳細的介紹。
查詢日誌緩衝區大小:
如上圖: •Stack Space是用來儲存使用者會話變數和數組的儲存地區; •User Session Data是為使用者會話使用的附加儲存區。 |--Session Information |--Sort Area |--Cursor Information 注意Session information(使用者會話資訊)在獨佔伺服器中與在共用伺服器中所處 的記憶體地區是不同的。
2-3:排序區,大池,Java池 排序區(Sort Area)為有排序要求的SQL語句提供記憶體空間。系統使用專用的記憶體區 域進行資料排序,這部分空間就是排序區。在Oracle資料庫中,使用者資料的排序可使用 兩個地區,一個是記憶體排序區,一個是磁碟臨時段,系統優先使用記憶體排序區進行排序。 如果記憶體不夠,Orcle自動使用磁碟暫存資料表空間進行排序。為提高資料排序的速度,建議 盡量使用記憶體排序區,而不要使用臨時段。 參數sort_area_size用來設定排序區大小。(好象不能動態修改?)
大池(Large Pool)用於Database Backup工具--復原管理員(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來 確定,可以動態調整。 2-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區及其他•共用池•資料緩衝區• Java池•大池。 注意:如果不設定SGA_TARGET,則自動共用記憶體管理功能被禁止。 ========================================== SQL> show parameter statistics_level NAME TYPE VALUE --------------------- ----------- ------------ statistics_level string TYPICAL SQL> alter system set statistics_level=all; System altered. #typical和all有什麼區別? SQL> alter system set statistics_level=typical; System altered. SQL> show parameter sga_target NAME TYPE VALUE ------------- ----------- ---------- sga_target big integer 0 SQL> alter system set sga_target=170m; alter system set sga_target=170m * ERROR at line 1: ORA-02097: parameter cannot be modified because specified value is invalid ORA-00823: Specified value of sga_target greater than sga_max_size SQL> alter system set sga_target=20m; System altered. #不過後來又發現sga_target的值變成了140M? 下面是語句執行情況。 SQL> show parameter sga_target NAME TYPE VALUE ------------- ----------- ------- sga_target big integer 140M SQL> alter system set sga_target=0; System altered. SQL> show parameter sga_target NAME TYPE VALUE ------------------------------------ ----------- ------ sga_target big integer 0 #改為20M SQL> alter system set sga_target=20m; System altered. #顯示的是140M SQL> show parameter sga_target NAME TYPE VALUE ------------------------------------ ----------- ------ sga_target big integer 140M #不可縮減? SQL> alter system set sga_target=130m; alter system set sga_target=130m * ERROR at line 1: ORA-02097: parameter cannot be modified because specified value is invalid ORA-00827: could not shrink sga_target to specified value #不可增加 SQL> alter system set sga_target=141m; alter system set sga_target=141m * ERROR at line 1: ORA-02097: parameter cannot be modified because specified value is invalid ORA-00823: Specified value of sga_target greater than sga_max_size 3:Oracle執行個體的進程結構(Process Structure) Oracle包含三類進程: •使用者進程(User Process) •伺服器處理序(Server Process) •後台進程(Background Process) 3-1:使用者進程和伺服器處理序 當資料庫使用者請求串連到Oracle的服務時啟動使用者進程(比如啟動SQLPlus時)。 •使用者進程首先必須建立一個串連。 •使用者不能直接與Oracle伺服器,必須通過伺服器處理序互動。 •伺服器處理序是使用者進程與伺服器互動的橋樑,它可以與Oracle Server直接互動。 •伺服器處理序可以有共用和獨佔兩種形式。
3-2:後台進程(Backgroung Process) 資料庫的物理結構與記憶體結構之間的互動要通過後台進程來完成。資料庫的後台進程包 含兩類,一類是必須的,一類是可選的: •Mandatory background processes
3-2-2:LGWR(Log Writer,日誌寫入進程) 將日誌資料從日誌緩衝區寫入磁碟記錄檔組。資料庫在運行時,如果對資料庫進行修 改則產生日誌資訊,日誌資訊首先產生於日誌緩衝區。當日誌達到一定數量時,由LGWR將 將日誌資料寫入到記錄檔組,再經過日誌切換,由歸檔進程(ARCH)將日誌資料寫入歸 檔進程(前提是資料庫運行在歸檔模式下)。資料庫遵循寫日誌優先原則,即在寫資料之前 先寫日誌。 簡單介紹 •ARCH(Archiver,歸檔進程) 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存在於多線程伺服器體繫結構中,負責將使用者進程串連到伺服器處理序,再把結果返 回給使用者進程。
|
|