日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
OracleRedo的并行機(jī)制運(yùn)行中要用到的代碼

我們今天主要介紹的是Redo log 恢復(fù)與高級(jí)特性的重要相關(guān)數(shù)據(jù),我們大家都知道一個(gè)Oracle redo條目包含了相應(yīng)操作導(dǎo)致的數(shù)據(jù)庫(kù)變化的所有的信息,所有redo條目最終都要被寫(xiě)入redo文件中去。

成都創(chuàng)新互聯(lián)技術(shù)團(tuán)隊(duì)十載來(lái)致力于為客戶提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站制作、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過(guò)多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了1000+網(wǎng)站,包括各類(lèi)中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。

Redo log buffer是為了避免Redo文件IO導(dǎo)致性能瓶頸而在sga中分配出的一塊內(nèi)存。

一個(gè)redo條目首先在用戶內(nèi)存(PGA)中產(chǎn)生,然后由oracle服務(wù)進(jìn)程拷貝到log buffer中,當(dāng)滿足一定條件時(shí),再由LGWR進(jìn)程寫(xiě)入Oracle redo文件。

由于log buffer是一塊“共享”內(nèi)存,為了避免沖突,它是受到redo allocation latch保護(hù)的,每個(gè)服務(wù)進(jìn)程需要先獲取到該latch才能分配redo buffer。因此在高并發(fā)且數(shù)據(jù)修改頻繁的oltp系統(tǒng)中,我們通??梢杂^察到redo allocation latch的等待。Redo寫(xiě)入redo buffer的整個(gè)過(guò)程如下:

在PGA中生產(chǎn)Redo Enrey -> 服務(wù)進(jìn)程獲取Redo Copy latch(存在多個(gè)---CPU_COUNT*2) -> 服務(wù)進(jìn)程獲取redo allocation latch(僅1個(gè)) -> 分配log buffer -> 釋放redo allocation latch -> 將Redo Entry寫(xiě)入Log Buffer -> 釋放Redo Copy latch;

 
 
 
  1. shared strand

為了減少redo allocation latch等待,在oracle 9.2中,引入了log buffer的并行機(jī)制。其基本原理就是,將log buffer劃分為多個(gè)小的buffer,這些小的buffer被成為strand(為了和之后出現(xiàn)的private strand區(qū)別,它們被稱(chēng)之為shared strand)。

每一個(gè)strand受到一個(gè)單獨(dú)redo allocation latch的保護(hù)。多個(gè)shared strand的出現(xiàn),使原來(lái)序列化的redo buffer分配變成了并行的過(guò)程,從而減少了Oracle redo allocation latch等待。

shared strand的初始數(shù)據(jù)量是由參數(shù)log_parallelism控制的;在10g中,該參數(shù)成為隱含參數(shù),并新增參數(shù)_log_parallelism_max控制shared strand的***數(shù)量;_log_parallelism_dynamic則控制是否允許shared strand數(shù)量在_log_parallelism和_log_parallelism_max之間動(dòng)態(tài)變化。

 
 
 
  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. -------------------------- ---------- ------------------------------------------ 
  9. _log_parallelism 1 Number of log buffer strands 
  10. _log_parallelism_max 2 Maximum number of log buffer strands 
  11. _log_parallelism_dynamic TRUE Enable dynamic strands 

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

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

關(guān)于shared strand的數(shù)量設(shè)置,16個(gè)cpu之內(nèi)***默認(rèn)為2,當(dāng)系統(tǒng)中存在Oracle redo allocation latch等待時(shí),每增加16個(gè)cpu可以考慮增加1個(gè)strand,***不應(yīng)該超過(guò)8。并且_log_parallelism_max不允許大于cpu_count。

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

 
 
 
  1. Private strand

為了進(jìn)一步降低redo buffer沖突,在10g中引入了新的strand機(jī)制——Private strand。Private strand不是從log buffer中劃分的,而是在shared pool中分配的一塊內(nèi)存空間?!?/p>

 
 
 
  1. HELLODBA.COM>select * from V$sgastat where name like '%strand%';
  2. POOL NAME BYTES
  3. ------------ -------------------------- ----------
  4. shared pool private strands 2684928
  5. HELLODBA.COM>select indx,strand_size_kcrfa from x$kcrfstrand where last_buf_kcrfa = '00';
  6. INDX STRAND_SIZE_KCRFA
  7. ---------- -----------------
  8. 2 66560
  9. 3 66560
  10. 4 66560
  11. 5 66560
  12. 6 66560
  13. 7 66560
  14. 8 66560
  15. ...

Private strand的引入為Oracle的Oracle Redo/Undo機(jī)制帶來(lái)很大的變化。每一個(gè)Private strand受到一個(gè)單獨(dú)的redo allocation latch保護(hù),每個(gè)Private strand作為“私有的”strand只會(huì)服務(wù)于一個(gè)活動(dòng)事務(wù)。

獲取到了Private strand的用戶事務(wù)不是在PGA中而是在Private strand生成Redo,當(dāng)flush private strand或者commit時(shí),Private strand被批量寫(xiě)入log文件中。如果新事務(wù)申請(qǐng)不到Private strand的redo allocation latch,則會(huì)繼續(xù)遵循舊的redo buffer機(jī)制,申請(qǐng)寫(xiě)入shared strand中。事務(wù)是否使用Private strand,可以由x$ktcxb的字段ktcxbflg的新增的第13位鑒定:

 
 
 
  1. HELLODBA.COM>select decode(bitand(ktcxbflg, 4096),0,1,0) used_private_strand, count(*)
  2. 2 from x$ktcxb
  3. 3 where bitand(ksspaflg, 1) != 0
  4. 4 and bitand(ktcxbflg, 2) != 0
  5. 5 group by bitand(ktcxbflg, 4096);
  6. USED_PRIVATE_STRAND COUNT(*)
  7. ------------------- ----------
  8. 1 10
  9. 0 1

對(duì)于使用Private strand的事務(wù),無(wú)需先申請(qǐng)Oracle Redo Copy Latch,也無(wú)需申請(qǐng)Shared Strand的redo allocation latch,而是flush或commit是批量寫(xiě)入磁盤(pán),因此減少了Redo Copy Latch和redo allocation latch申請(qǐng)/釋放次數(shù)、也減少了這些latch的等待,從而降低了CPU的負(fù)荷。過(guò)程如下:

事務(wù)開(kāi)始 -> 申請(qǐng)Private strand的redo allocation latch (申請(qǐng)失敗則申請(qǐng)Shared Strand的redo allocation latch) -> 在Private strand中生產(chǎn)Redo Enrey -> Flush/Commit -> 申請(qǐng)Redo Copy Latch -> 服務(wù)進(jìn)程將Redo Entry批量寫(xiě)入Log File -> 釋放Redo Copy Latch -> 釋放Private strand的redo allocation latch

注意:對(duì)于未能獲取到Private strand的Oracle redo allocation latch的事務(wù),在事務(wù)結(jié)束前,即使已經(jīng)有其它事務(wù)釋放了Private strand,也不會(huì)再申請(qǐng)Private strand了


網(wǎng)站名稱(chēng):OracleRedo的并行機(jī)制運(yùn)行中要用到的代碼
鏈接地址:http://m.5511xx.com/article/cdhoghh.html