溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Oracle的增量檢查點(diǎn)指的是什么

發(fā)布時(shí)間:2021-11-03 17:39:37 來源:億速云 閱讀:127 作者:柒染 欄目:建站服務(wù)器

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Oracle的增量檢查點(diǎn)指的是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、為什么要有檢查點(diǎn)
   被修改過的塊,在oracle中都被統(tǒng)稱為臟塊.所有的臟塊被一個(gè)鏈表串起來,稱做檢查點(diǎn)隊(duì)列.在buffer cache中,每一個(gè)塊都有一個(gè)buffer header 簡稱BH,在BH中有一個(gè)ckptq項(xiàng),此項(xiàng)目中記錄了指向檢查點(diǎn)隊(duì)列上一個(gè)塊和下一個(gè)塊的指針.如果某一個(gè)塊不在檢查點(diǎn)隊(duì)列中,他的ckptq項(xiàng)為空.通過ckptq項(xiàng)oracle將所有的臟塊串成了一個(gè)雙向鏈表.這個(gè)雙向鏈表就是檢查點(diǎn)隊(duì)列了.
1,只有臟塊才會(huì)在檢查點(diǎn)隊(duì)列中,非臟塊的ckptq為空.
2,當(dāng)塊首次被更改時(shí),塊會(huì)立即被加進(jìn)檢查點(diǎn)隊(duì)列.如果檢查點(diǎn)隊(duì)列中的臟塊再次被修改,并不會(huì)改變其在檢查點(diǎn)隊(duì)列中的位置.
3,檢查點(diǎn)隊(duì)列中臟塊的排列順序:根據(jù)第2點(diǎn),所有臟塊按照首次被更改的時(shí)間的順序排列.更準(zhǔn)確點(diǎn)說:按照塊的lrba排列.

二、什么是rba? lrba? hrba
  rba就是重做塊地址,比如說,用戶發(fā)出了一條update命令,更新了塊A,塊A現(xiàn)在變成了臟塊,oracle會(huì)為他生成一條重做記錄.這條重做記錄在重做日志文件中的位置就是rba(redo block address).過了一會(huì)兒,假如:塊A依然還是臟塊,此時(shí).用戶又發(fā)出一條更新塊A的命令,這又會(huì)生成一條重做記錄.第一條更新命令對(duì)應(yīng)的重做記錄的rba被稱為塊A的lrba(low rba),第二條更新命令對(duì)應(yīng)的rba,被稱為hrba(high rba).其實(shí),按照lrba來排列,就是按照塊首次被修改的順序來排列.
  下面說說DBWR寫臟塊的方式,有了檢查點(diǎn)隊(duì)列之后,臟塊按照首次變臟的時(shí)間順序排列,DBWR每到一定的時(shí)機(jī),就會(huì)被觸發(fā),沿著檢查點(diǎn)隊(duì)列的順序刷新臟塊,具體在oracle中有幾個(gè)參數(shù)用來確定檢查點(diǎn)隊(duì)列的長度.另有一個(gè)CKPT進(jìn)程,會(huì)監(jiān)控著檢查點(diǎn)隊(duì)列的長度,當(dāng)檢查點(diǎn)隊(duì)列的長度達(dá)到一定限制時(shí),CKPT會(huì)通知DBWR寫臟塊.CKPT會(huì)根據(jù)參數(shù)的設(shè)置和I/O的速度以及繁忙程度,計(jì)算出來一個(gè)Target rba(目標(biāo)rba),DBWR會(huì)沿著檢查點(diǎn)隊(duì)列,將所有Target rba之前的臟塊刷新到磁盤.當(dāng)CKPT通知完DBWR Target rba后,CKPT的任務(wù)就結(jié)束了.他并不會(huì)等待DBWR寫完所有的Target rba之前的臟塊.通知DBWR寫臟塊,這是CKPT的任務(wù)之一,CKPT另有一個(gè)任務(wù),就是每3秒,檢測(cè)一次DBWR的寫進(jìn)度.檢查點(diǎn)隊(duì)列最前面的塊被稱為檢查點(diǎn)位置.DBWR是沿著檢查點(diǎn)隊(duì)列寫臟塊的,CKPT每3秒鐘查看一下DBWR沿檢查點(diǎn)隊(duì)列寫到了哪里,并且將這個(gè)位置設(shè)置為檢查點(diǎn)位置.也就是說檢查點(diǎn)位置之前的塊,都是已被DBWR刷新到磁盤上的塊.這個(gè)3秒一次檢查DBWR進(jìn)度的工作,也是CKPT的一個(gè)重要的任務(wù).CKPT每3秒一次將檢查點(diǎn)位置記錄進(jìn)控制文件,當(dāng)然同時(shí)被記錄進(jìn)控制文件的還有'心跳'等其他信息.CKPT每3秒一次的工作和CKPT定期觸發(fā)DBWR,這兩項(xiàng)操作合一起被稱為--增量檢查點(diǎn).
下面的就是CKPT每3秒寫進(jìn)控制文件的信息
SQL> alter session set events 'immediate trace name controlf level 8';
會(huì)話已更改。
具體內(nèi)容如下:
***************************************************************************
CHECKPOINT PROGRESS RECORDS
***************************************************************************
(size = 8180, compat size = 8180, section max = 11, section in-use = 0,
  last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 2, numrecs = 11)
THREAD #1 - status:0x2 flags:0x0 dirty:89
low cache rba 0x2ad.908.0)[檢查點(diǎn)位置] on disk rba 0x2ad.d2f.0)[最后一條重做記錄的rba]
on disk scn: 0x0000.00237745 03/02/2008 15:03:44[最后一條重做記錄的scn]
resetlogs scn: 0x0000.0008297b 08/27/2007 09:51:58
heartbeat: 648318959[心跳] mount id: 1201288562
...
...
這里面的大多數(shù)信息可以通過x$kcccp中看到.
SQL> select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low
RBA",CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT from x$kcccp;
     CPDRT Low RBA         On disk RBA     CPODS            CPODT                     CPHBT
---------- --------------- --------------- ---------------- -------------------- ----------
        35 686.124.0       686.220.0       2325376          03/02/2008 15:18:54   648319278
說明:
     CPDRT列是檢查點(diǎn)隊(duì)列中的臟塊數(shù)目.
     CPODS列是on disk rba的scn
     CPODT列是on disk rba的時(shí)間戳
     CPHBT列是心跳
  檢查點(diǎn)位置是是個(gè)rba,他指向著重做日志文件中的某個(gè)重做記錄.在此位置前的重做記錄,其對(duì)應(yīng)的信息已經(jīng)被寫進(jìn)了數(shù)據(jù)文件,在此位置后的重做記錄,所對(duì)應(yīng)的是數(shù)據(jù)塊,有可能還在內(nèi)存中.如果發(fā)生了實(shí)例崩潰,只需要在日志文件中找到檢查點(diǎn)位置,從此處開始應(yīng)用所有的重做日志文件,就完成了前滾操作.實(shí)例崩潰后,再次啟動(dòng)數(shù)據(jù)庫,oracle會(huì)到控制文件中讀取low cache rba,這就是檢查點(diǎn)位置.從此處開始應(yīng)用重做信息,應(yīng)用到on disk rba處.on disk rba是磁盤中重做日志文件的最后一條重做記錄的rba.  如果某條命令的重做記錄的rba高于on disk rba,那說明此重做記錄還沒有被寫進(jìn)日志文件中,崩潰發(fā)生時(shí),他是不可能被恢復(fù)的.on disk rba是oracle前滾操作的終點(diǎn).on disk 顧名思義 就是'在磁盤上'的意思.比這個(gè)更高的rba,都在log buffer中,還沒有來的急被寫進(jìn)磁盤中的日志文件.所以是不能被用于恢復(fù)的.下面假設(shè)一個(gè)實(shí)例恢復(fù)的例子:
Table表每行2000個(gè)字節(jié),塊大小8K,每塊可容納table的3行,按如下發(fā)布7條更新命令:
Update table set name=low(name) where id=1; ------塊1 RBA :692.2998.10
Update table set name=low(name) where id=2; ------塊1 RBA :692.3015.10
Update table set name=low(name) where id=4; ------塊2 RBA :692.3024.10
Update table set name=low(name) where id=7; ------塊3 RBA :692.3033.10
Update table set name=low(name) where id=3; ------塊1 RBA :692.3102.10
Update table set name=low(name) where id=10; ------塊4 RBA :692.3127.10
Update table set name=low(name) where id=13; ------塊5 RBA :692.3136.10
上面七條更新命令后,每塊狀態(tài)為:

1號(hào)塊

2號(hào)塊

3號(hào)塊

4號(hào)塊

5號(hào)塊

Lrba:692.2998.10

Hrba:692.3102.10

Lrba:692.3024.10

Hrba:692.3024.10

Lrba:692.3033.10

Hrba:692.3033.10

Lrba:692.3127.10

Hrba:692.3127.10

Lrba:692.3136.10

Hrba:692.3136.10


  Lrba就是塊首次變臟時(shí)的RBA,而Hrba,是最后一次改變塊中信息,所對(duì)應(yīng)的重做記錄的RBA。1號(hào)塊外被修改兩次,Lrba和Hrba不同。2到5號(hào)塊只被修改一次,Lrba和Hrba相同。相應(yīng)的重做記錄有:

RBA:692.2998.10(第一條更新命令對(duì)應(yīng)的重做記錄)

回滾段頭重做信息 回滾段塊重做信息 1號(hào)塊第1行重做信息

(下面的重做記錄中省略具體的信息)

RBA:692.3015.10 (第二條更新命令對(duì)應(yīng)的重做記錄)

RBA:692.3024.10 (第三條更新命令對(duì)應(yīng)的重做記錄)

RBA:692.3033.10 (第四條更新命令對(duì)應(yīng)的重做記錄)

RBA:692.3102.10 (第五條更新命令對(duì)應(yīng)的重做記錄)

RBA:692.3127.10 (第六條更新命令對(duì)應(yīng)的重做記錄)

RBA:692.3136.10 (第七條更新命令對(duì)應(yīng)的重做記錄)


  假如此時(shí),1號(hào)塊和2號(hào)塊已經(jīng)變得不臟,3、4、5號(hào)塊仍是臟塊,所有的臟塊依Lrba順序按列為檢查點(diǎn)隊(duì)列,其中檢查點(diǎn)隊(duì)列頭(此處是3號(hào)塊)的Lrba就是檢查點(diǎn)位置,此處為692.3033.10。這個(gè)值被記錄在控制文件中。如果發(fā)生了實(shí)例崩潰,Oracle將從控制文件中取出692.3033.10,到692號(hào)重做日志中,找到第3033塊,從此處開始,應(yīng)用所有的重做日志,直到重做日志文件的最未尾。而重做日志文件的最未尾重做記錄的RBA,又叫On disk rba。從檢查點(diǎn)位置處,應(yīng)用重做記錄到On disk rba處,這個(gè)過程就是前滾。
  如下幾個(gè)參數(shù)可以用來限制檢查點(diǎn)隊(duì)列的長度:
1,fast_start_io_target
  該參數(shù)用于表示數(shù)據(jù)庫發(fā)生Instance Recovery 的時(shí)候需要產(chǎn)生的IO總數(shù),他通過v$filestat的AVGIOTIM來估算的.比如我們一個(gè)數(shù)據(jù)庫發(fā)生Instance Crash后需要在10分鐘內(nèi)恢復(fù)完畢,假定OS的IO每秒為500個(gè),那么這個(gè)數(shù)據(jù)庫發(fā)生Instance Recovery的時(shí)候大概產(chǎn)生500*10*60=30,000次IO,也就是我們將可以把fast_start_io_target設(shè)置為30000.
2,fast_start_mttr_target
  我們從上面可以看到fast_start_io_target來估算檢查點(diǎn)位置比較麻煩.oracle為了簡化這個(gè)概念,從9I開始引入了fast_start_mttr_target這么一個(gè)參數(shù),用于表示數(shù)據(jù)庫發(fā)生Instance Recovery的時(shí)間.以秒為單位,這個(gè)參數(shù)我們從字面上也比較好理解,其中的mttr是mean time to recovery的簡寫,如上例中的情況我們可以將fast_start_mttr_target設(shè)置為600.當(dāng)設(shè)置了fast_start_mttr_target后,fast_start_io_target這個(gè)參數(shù)將不再生效,從9I后fast_start_io_target這個(gè)參數(shù)被oracle廢除了.
3,log_checkpoint_timeout
  該參數(shù)用于表示檢查點(diǎn)位置和重做日志尾之間的時(shí)間間隔,以秒為單位,默認(rèn)情況下是1800秒,這個(gè)參數(shù)實(shí)際上表示了臟塊保持臟狀態(tài)的最長時(shí)間.如果它被定為1800秒,沒有臟塊保持1800秒后,還是為臟.設(shè)log_checkpoint_timeout為1800秒.

  相比fast_start_mttr_target,它也是時(shí)間,但它的時(shí)間值表示完成恢復(fù)操作所需要的時(shí)間,即從最后的檢查點(diǎn)位置開始,應(yīng)用所有日志直到日志末尾所需要的時(shí)間.而本參數(shù)表示從最后的檢查點(diǎn)位置開始,到日志末尾經(jīng)過的時(shí)間.在標(biāo)準(zhǔn)版中,本參數(shù)的最小值是900.
4,log_checkpoint_interval
  該參數(shù)是表示檢查點(diǎn)位置和重做日志末尾的塊的數(shù)量.以O(shè)S表示.
5,90% OF SMALLEST REDO LOG
  Oracle內(nèi)部事實(shí)上還將重做日志末尾前面90%的位置設(shè)為檢查點(diǎn)位置,這不是一個(gè)參數(shù),這是oracle內(nèi)部規(guī)定的一個(gè)觸發(fā)增量檢查點(diǎn)的事件.上面這些條件,嚴(yán)格來說,并不是控制檢查點(diǎn)什么時(shí)候發(fā)生,而是控制檢查點(diǎn)隊(duì)列中可以有多少個(gè)塊.在前4個(gè)參數(shù)中,9I中oracle推薦使用fast_start_mttr_target替代第一個(gè)fast_start_io_target.fast_start_mttr_target,log_checkpoint_timeout,log_checkpoint_interval和90% OF SMALLEST REDO LOG 可以同時(shí)使用.考慮這樣一種情況,如果上面的這些觸發(fā)增量檢查點(diǎn)的參數(shù)都被設(shè)置,并且在某一時(shí)刻,這幾個(gè)參數(shù)一起被觸發(fā),但他們指定的Target RBA位置可能不盡相同,oracle將離日志末尾最近的那個(gè)位置認(rèn)為檢查點(diǎn)位置,如下圖所示: 
  在這種情況下,將會(huì)把log_checkpoint_interval的位置定為下一增量檢查點(diǎn)的Target RBA.在9I后,對(duì)檢查點(diǎn)頻率,建議只設(shè)置fast_start_mttr_target.根據(jù)需要,也可以通過設(shè)置log_checkpoint_timeout,設(shè)置一個(gè)臟塊保持臟狀態(tài)的最大時(shí)間,而其他兩個(gè)參數(shù)
fast_start_io_target,log_checkpoint_interval建議不再使用.
  Oracle寫臟塊并不一定都從檢查點(diǎn)隊(duì)列中寫.在v$sysstat視圖中,有兩項(xiàng)關(guān)于物理寫的資料.physical writes 和physical writes non checkpoint.也就是說,oracle將對(duì)臟塊的寫分為兩類.一類是通過檢查點(diǎn)的寫,一類是不通過檢查點(diǎn)的寫.我把它叫做檢查點(diǎn)無關(guān)寫.比如說:當(dāng)表空間脫機(jī)時(shí),會(huì)把隸屬于該表空間的所有臟塊都寫進(jìn)數(shù)據(jù)文件,但是不會(huì)發(fā)生檢查點(diǎn),這個(gè)寫就是檢查點(diǎn)無關(guān)寫. 還有其他的情況會(huì)發(fā)生檢查點(diǎn)無關(guān)寫,我會(huì)在以后的實(shí)驗(yàn)中介紹.一個(gè)小實(shí)驗(yàn),證明下檢查點(diǎn)無關(guān)寫:為了避免檢查點(diǎn)對(duì)實(shí)驗(yàn)的影響,將檢查點(diǎn)的發(fā)生頻率設(shè)置的低一些.
命令如下:
alter system set fast_start_mttr_target=0;
alter system set log_checkpoint_timeout=3600;
步驟一:在實(shí)驗(yàn)前先觀察下當(dāng)前物理寫的值:
SQL> select * from v$sysstat where name='physical writes non checkpoint';
STATISTIC# NAME                                CLASS      VALUE    STAT_ID
---------- ------------------------------ ---------- ---------- ----------
       67 physical writes non checkpoint          8       3738 2602029796
步驟二:隨便開始一個(gè)事務(wù)
SQL> update jj_10 set name='aa' where id=20;
已更新 1 行。
步驟三:把步驟二中的表脫機(jī):
SQL> alter tablespace jj_ts_1 offline;
表空間已更改。
步驟四:此時(shí)再去查看資料視圖:
SQL> select * from v$sysstat where name='physical writes non checkpoint';
STATISTIC# NAME                                CLASS      VALUE    STAT_ID
---------- ------------------------------ ---------- ---------- ----------
        67 physical writes non checkpoint          8       3759 2602029796
比較后發(fā)現(xiàn),檢查點(diǎn)無關(guān)寫從3738增加到3759.為了觀察到通過檢查點(diǎn)隊(duì)列的寫,把檢查點(diǎn)頻率調(diào)的高一點(diǎn):
alter system set log_checkpoint_timeout=10;
步驟一:
SQL> select * from v$sysstat where name='physical writes' or name='physical writes non
checkpoint';
STATISTIC# NAME                                CLASS      VALUE    STAT_ID
---------- ------------------------------ ---------- ---------- ----------
        62 physical writes                         8       5822 1190468109
        67 physical writes non checkpoint          8       3829 2602029796
  用physical writes減去physical writes non checkpoint所得到的結(jié)果,將近似于通過檢查點(diǎn)隊(duì)列的寫.為什么說近似于呢?因?yàn)閛racle內(nèi)部會(huì)有很多寫,比如說控制文件的寫操作,也會(huì)被記錄進(jìn)physical writes資料.
步驟二:發(fā)布更新命令
SQL> update jj_10 set name='aa' where id=20;
已更新 1 行。
步驟三:觀察塊是否變的不臟.
SQL> select dirty,status from v$bh where file#=7 and block#=406 and status='xcur';
D STATUS
- -------
N xcur
步驟四:在塊變的不臟后,馬上查看資料視圖.
SQL> select * from v$sysstat where name='physical writes' or name='physical writes non
checkpoint';
STATISTIC# NAME                                CLASS      VALUE    STAT_ID
---------- ------------------------------ ---------- ---------- ----------
        62 physical writes                         8       5851 1190468109
        67 physical writes non checkpoint          8       3832 2602029796
  可以看到檢查點(diǎn)無關(guān)寫多了3個(gè)字節(jié),這3個(gè)字節(jié)和我們的更新聲明沒有關(guān)系.我們的更新聲明更新了幾十個(gè)字節(jié).這3個(gè)字節(jié)應(yīng)該是屬于oracle內(nèi)部的一些寫操作,我們的更新聲明,所產(chǎn)生的臟塊,是通過檢查點(diǎn)隊(duì)列寫出的.physical writes 多了很多。

上述就是小編為大家分享的Oracle的增量檢查點(diǎn)指的是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI