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

來源:互聯網
上載者:User

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)用於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來   確定,可以動態調整。

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),負責將使用者進程串連到伺服器處理序,再把結果返回給使用者進程。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.