教你如何成為Oracle 10g OCP - 第十三章補充:RMAN備份使用PGA還是SGA

tolywang發表於2011-05-16

           RMAN基於備份演算法規則來編譯要備份的資料檔案列表。基於通道數和同時備份的資料檔案數,RMAN在ORACEL共享記憶體段中建立一些記憶體緩衝區, 一般是在PGA中, 不過有時候記憶體緩衝區會被推入SGA。通道服務程式隨後就開始讀取資料檔案,並在RMAN緩衝區中填充這些資料塊。一個緩衝區被填滿時,輸入緩衝區的資料就會推出到輸出緩衝區。資料檔案中的資料塊都會發生這種memery-to-monery write 的過程,如果資料塊符合備份的標準,並且memery-to-monery  write操作沒有檢查到資料corruption  則該資料塊會被儲存到輸出資料緩衝區中,直到輸出緩衝區被填滿。一但輸出緩衝區被填滿,輸出緩衝區的內容就會被推到備份位置(磁碟或者磁帶).  

        那麼到底RMAN在什麼時候使用PGA,  什麼時候又會被推入SGA呢 ? 

        在磁碟上的備份會使用PGA記憶體作為備份緩衝區,PGA記憶體空間從用於通道程式的記憶體空間中分配。 如果作業系統沒有配置本地非同步I/O,  可以利用DBWR_IO_SLAVES引數使用I/O從屬來填充記憶體中的輸出緩衝區。如果設定DBWR_IO_SLAVES引數為任意的非零值 (Oracle下預設一般是0),RMAN會自動分配4個I/O從屬來協調緩衝區記憶體中資料塊載入。為了實現這一功能,RMAN必須利用一個共享記憶體區域 。 因此,用於磁碟備份的記憶體緩衝區會被推入共享池 ,如果存在Large池,則被推入large池。

       即如果沒有配置作業系統非同步I/O,  引數 DBWR_IO_SLAVES = 0 (預設是0),那麼RMAN記憶體緩衝區使用PGA  ;    如果配置 DBWR_IO_SLAVES = 非零值, 那麼RMAN磁碟備份的記憶體緩衝區會被推入SGA中的共享池(shared pool), 如果有larget pool  ,    會被推入larget pool .  

       如果沒有使用磁帶I/O從屬  (預設BACKUP_TAPE_IO_SLAVES=FALSE), 會在PGA中分配用於磁帶輸出緩衝區的記憶體 ;       如果設定 BACKUP_TAPE_IO_SLAVES=TURE,   利用磁帶I/O從屬 RMAN會為每個通道建立一個從屬程式來幫助備份工作。為了協調這一功能,RMAN會將記憶體分配推入SGA。

        Large池是Oracle記憶體空間的SGA中的一個特定區域。 對於某些需要共享空間且涉及共享池中常見操作的記憶體可以利用large池。 佔用large池的主要限於RMAN記憶體緩衝區 (如果使用了I/O從屬)  和用於共享伺服器。Large池又是用於java連線,如果PARALLEL_AUTOMATIC_TUNING (10g中不再使用) 被設定為TRUE,   large池還會包括並行查詢從屬(parallel query slave)

         實際上,我們不一定需要large池。如果沒有large池,所有可能佔用large池的會簡單地使用共享池(shared pool)中的空間。 不過最好將RMAN緩衝區分到PGA中他們自己獨立的空間中。這樣,SQL和PL/SQL分析以及其他普通操作的共享池操作不會受到RMAN備份的影響。反之亦然,此外還可以更方便,更直接地調整RMAN的Oracle記憶體空間。

       如果配置了任一種I/O從屬選項並且沒有配置large池,則會從SGA的共享池區(shared pool)中分配記憶體。如果沒有配置large池卻又要使用I/O從屬,我們建議最好建立一個large池,這個large池的大小基於備份分配的通道總數(加上1MB用於開銷)。

      Larget pool 通常用於RMAN備份恢復, MTS共享伺服器,平行計算中, 在Oracle9i或之前設定large pool的大小引數為 larget_pool_size ,   10g 及以後一般使用ASMM (自動共享記憶體管理), 只需指定SGA_TARGET引數(SAG的總大小),資料庫將會根據負載和歷史資訊來自動分配SAG的每個元件。  啟用ASSM需將STATISTICS_LEVEL引數設為TYPICAL或ALL,  並且SGA_TARGET引數為非0. 

ASMM自動分配以下SGA元件:
--DB_CACHE_SIZE
--SHARED_POOL_SIZE
--LARGE_POOL_SIZE
--JAVE_POOL_SIZE
以下的元件還需要手動來管理
--LOG_BUFFER
--DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE,DB_nK_CACHE_SIZE
--STREAMS_POOL_SIZE
--Fixed-SGA area and internal allocations

如果使用spfile,  我們在 create pfile='xxxx'  from spfile ; 之後看到的larege_pool_size 就是當時large_pool 被分配的記憶體空間。  類似下面:

ecsdb2.__db_cache_size=5486149632
ecsdb1.__db_cache_size=3456106496
ecsdb1.__java_pool_size=33554432
ecsdb2.__java_pool_size=16777216
ecsdb1.__large_pool_size=16777216
ecsdb2.__large_pool_size=16777216

ecsdb2.__shared_pool_size=3053453312
ecsdb1.__shared_pool_size=5033164800
ecsdb1.__streams_pool_size=33554432
ecsdb2.__streams_pool_size=0

不過在10g 中檢視引數一般都是 0 : 

SQL> show parameter large_pool

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
large_pool_size                      big integer 0 

Oracle 9i 在使用RMAN備份的時候, 分配多通道(channel) ,可以考慮參考如下公式:

LARGE_POOL_SIZE = number_of_allocated_channels * (16MB+( 4 * size_of_tape_buffer))

 

如果在磁帶上做備份,就需要使用一個Media Management Server(介質管理伺服器)產品。如果從與目標資料庫相同的系統執行Media Manager(介質管理器),磁帶子系統會需要額外的系統資源。調整備份時一定要考慮到這個因素。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-695461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章