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存在於多線程伺服器體繫結構中,負責將使用者進程串連到伺服器處理序,再把結果返   回給使用者進程。  
 
  | 
       
     
      |