(一)內存結構和進程結構 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-3:共享池(share pool)
共享池是對sql,pl/sql程序進行語法分析,編譯,執行的內存區域。
它包含三個部分:(都不可單獨定義大小,必須通過share pool間接定義)。
•庫緩沖區(library cache)包含sql,pl/sql語句的分析碼,執行計劃。
•數據字典緩沖區(data dictionary cache)表,列定義,權限。
•用戶全局區(usr global area)用戶mts會話信息。
共享池的大小可以動態修改:
======================================
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.
======================================
#上面的__shared_pool_size一行奇怪?
2-2:程序全局區pga(programe global area)
程序全局區是包含單個用戶或服務器數據和控制信息的內存區域,它是在用戶進程連
接到oracle并創建一個會話時由oracle自動分配的,不可共享,主要用于用戶在編程存
儲變量和數組。

如上圖:
•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)用于數據庫備份工具--恢復管理器(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-1:dbwr(database writer,數據寫入進程)
將數據緩沖區的數據寫入數據文件,是負責數據緩沖區管理的一個后臺進程。
當數據緩沖區中的一數據被修改后,就標記為dirty,dbwr進程將數據緩沖區中“臟”
數據寫入數據文件,保持數據緩沖區的”干凈“。由于數據緩沖區的數據被用戶修改并占
用,空閑數據緩沖區會不斷減少,當用戶進程要從磁盤讀取數據塊到數據緩沖區卻無法找
到足夠的空閑數據緩沖區時,dbwr將數據緩沖區內容寫入磁盤,使用戶進程總可以得到足
夠的空閑數據緩沖區。
dbwr的作用:
•管理數據緩沖區,以便用戶進程總能夠找到足夠的空閑緩沖區。
•將所有修改后的緩沖區數據寫入數據文件。
•使用lru(最近最少使用)算法保持緩沖區數據是最近經常使用的。
•通過延遲寫來優化磁盤i/0讀寫。
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存在于多線程服務器體系結構中,負責將用戶進程連接到服務器進程,再把結果返
回給用戶進程。
新聞熱點
疑難解答