程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle redo的條目主要包含的內容

Oracle redo的條目主要包含的內容

編輯:Oracle數據庫基礎

Redo log 的主要功能是用於恢復與一個相關高級特性的十分重要的數據,一個Oracle redo的條目主要包含了其實際操作導致的Oracle數據庫變化的全部信息,所有redo條目最終都要被寫入redo文件中去。

Redo log buffer是為了避免Oracle Redo文件IO導致性能瓶頸而在sga中分配出的一塊內存。

一個redo條目首先在用戶內存(PGA)中產生,然後由Oracle服務進程拷貝到log buffer中,當滿足一定條件時,再由LGWR進程寫入redo文件。由於log buffer是一塊“共享”內存,為了避免沖突,它是受到redo allocation latch保護的,每個服務進程需要先獲取到該latch才能分配redo buffer。因此在高並發且數據修改頻繁的oltp系統中,我們通常可以觀察到redo allocation latch的等待。

Oracle Redo寫入redo buffer的整個過程如下:

在PGA中生產Redo Enrey -> 服務進程獲取Redo Copy latch(存在多個---CPU_COUNT*2) -> 服務進程獲取redo allocation latch(僅1個) -> 分配log buffer -> 釋放redo allocation latch -> 將Redo Entry寫入Log Buffer -> 釋放Redo Copy latch;

shared strand

為了減少redo allocation latch等待,在Oracle 9.2中,引入了log buffer的並行機制。其基本原理就是,將log buffer劃分為多個小的buffer,這些小的buffer被成為strand(為了和之後出現的private strand區別,它們被稱之為shared strand)。

每一個strand受到一個單獨redo allocation latch的保護。多個shared strand的出現,使原來序列化的redo buffer分配變成了並行的過程,從而減少了rOracle edo allocation latch等待。

shared strand的初始數據量是由參數log_parallelism控制的;在10g中,該參數成為隱含參數,並新增參數_log_parallelism_max控制shared strand的最大數量;_log_parallelism_dynamic則控制是否允許shared strand數量在_log_parallelism和_log_parallelism_max之間動態變化。

  1. HELLODBA.COM>select nam.ksppinm, val.KSPPSTVL, nam.ksppdesc   
  2. 2 from sys.x$ksppi nam,   
  3. 3 sys.x$ksPPSv val   
  4. 4 where nam.indx = val.indx   
  5. 5 --AND nam.ksppinm LIKE '_%'   
  6. 6 AND upper(nam.ksppinm) LIKE '%LOG_PARALLE%';   
  7. KSPPINM KSPPSTVL KSPPDESC   
  8. _log_parallelism 1 Number of log buffer strands   
  9. _log_parallelism_max 2 Maximum number of log buffer strands   
  10. _log_parallelism_dynamic TRUE Enable dynamic strands   

每一個shared strand的大小 = log_buffer/(shared strand數量)。strand信息可以由表x$kcrfstrand查到(包含shared strand和後面介紹的private strand,10g以後存在)。 

  1. HELLODBA.COM>select indx,strand_size_kcrfa from x$kcrfstrand where last_buf_kcrfa != '00';   
  2. INDX STRAND_SIZE_KCRFA   
  3. 0 3514368   
  4. 1 3514368   
  5. HELLODBA.COM>show parameter log_buffer   
  6. NAME TYPE VALUE   
  7. log_buffer integer 7028736  

關於shared strand的數量設置,16個cpu之內最大默認為2,當系統中存在Oracle redo allocation latch等待時,每增加16個cpu可以考慮增加1個strand,最大不應該超過8。並且_log_parallelism_max不允許大於cpu_count。

注意:在11g中,參數_log_parallelism被取消,shared strand數量由_log_parallelism_max、_log_parallelism_dynamic和cpu_count控制。

Private strand

為了進一步降低Oracle redo buffer沖突,在10g中引入了新的strand機制——Private strand。Private strand不是從log buffer中劃分的,而是在shared pool中分配的一塊內存空間。 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved