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
6B0F0AE4 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),負責將用戶進程連接到服務器進程,再把結果返回給用戶進程。