Oracle 的检查点队列 (checkpoint queue)
生活随笔
收集整理的這篇文章主要介紹了
Oracle 的检查点队列 (checkpoint queue)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇文章是參考甲骨論老相老師的視頻:
http://v.youku.com/v_show/id_XNDAwOTY3MTU2.html
所做的學習筆記
1. LRU chain 和 LRUW chain 和 CBC chain
???? 先復習一下:
????
?
???????? 如上圖, 在database buffer cache中, 里面的buffer被若干條鏈串聯在一齊(通過頭尾部指針實現)
???????? LRU(Least recent used) chain
?????? 這是一條用于查找最近最少使用的buffer的鏈, 當buffer不夠用時會從這條鏈冷端找出buffer來重用.
???????? LRUW(Least recent used writed) chain
?????? 與上面那條LRC chain對應, 有一條專門for? 臟buffer的鏈, 而且是按最近修改次數排序的.
???????? DBWR后臺進程會將這條鏈的冷端buffers寫入dbf文件
???????? CBC(cache buffers chain)
?????? 根據buffer對應的block在dbf文件位置組織起來的鏈
?????? 這種鏈有很多條,? 如上圖,server process會根據block頭部信息算出對應的buffer在dababase buffer cache中的哪一條CBC中,然后遍歷出來.
???????
2.? Check Point Queue (檢查點隊列) chain
??????
?????? 這是按照第一次被修改的時間排列的臟buffer鏈.
????????? 注意2點:
??? ? ? ? 1, 里面都是臟buffer
????????? 2. 按照第一次被修改(變臟)時間排序
???????????????? 也就說有3個buffer?? 假如它們第一次修改時間分別是? 12:00 13:00 14:00, 那么它們就按照這個順序排序了, 假如15:00 時第1個buffer又被修改了,? 但是這時它們的順序不會變, 因為順序依據是第一次的被修改時間啊~?
3. Check Point Queue的內容和工作方式
?????? 這就是本文主要講的東西,? 不過要首先介紹幾個概念知識:
???????
??????????????? 3.1 RBA (Redo byte address)
???????????? 看名字就知道這是1個地址.
??????????????? 當database buffer cache里的1個buffer 被修改時, 也就是被變臟時就會產生日志, 而這些日志為被寫入到Log buffer cache(日志緩存里),? 那么這些日志在日志緩存里的位置就是RBA了.
??????????????? 而臟buffer會把對把對應的RBA記錄在自己的頭部信息中, 當這個臟buffer要被回滾時, server process就可以根據RBA找到對應的日志了.
?????????????? 而1個buffer的RBA并不是唯一的. 由于1個buffer可以在不同的時間段被多次修改, 就會產生多次日志, 而這些日志會被寫入到log buffer cache中的不同的位置. 所以往往1個buffer里面記錄著多個RBA.
?????????????
????????????? 3.2 LRBA (Low Redo byte address) 和 HRBA
?????????????LRBA是RBA的一種.?? 是對應臟buffer 第一次被修改的日志地址.? 而對應地 HRBA就是最近1次被修改的日志地址.
???????????????
????????????????
????????????? 3.3 Check Point Queue實際上是以臟buffer的LRBA順序鏈接起來的.
????????????? 剛才不是說是以第一次被修改的時間為序的嗎?
????????????????? 沒錯.? 而LRBA就是對應每個buffer第一次被修改的日志地址.
????????????????? 而且.? Oracle是嚴格按照日志的產生時間順序來寫日志的.?? 也就是地址靠后的日志產生時間肯定比地址靠前的日志產生時間要早.
????????????????
?????????????? 如下圖:
????????????????
?????????????????? 可以理解到, 當dirty buffer2在check point queue的位置比 dirty buffer1的位置靠后, 則代表 dirty buffer2的LRBA 肯定比 dirty buffer1 的LRBA 靠后.? 也即是 dirty buffer1 的第一次被修改時間比 dirty buffer2的第一次被修改時間早.
???????????????? 3.4 CKPT 進程.
????????????? checkpoint 進程也叫檢查點進程的, 以前都提過了, 是負責更新Oracle 控制文件的.
????????????????
??????????????
???????????????? 而CKPT有其中兩種事件:
???????????????? a. 完全檢查點 (completed checkpoint):
? ???????????? 這時CKPT進程 會 觸發 DBWR進程把 check point queue 上所有的臟buffer(也就是所有的臟buffer)寫入dbf文件.
??????????????????????
? ? ? ? ? ? ? ? ? ? ? ? ? 那么什么時候會出發這個完全檢查點的事件呢?? 很明顯,? 這個事件就是要將所有臟buffer寫入dbf files的事件.
????????????????????????? 通常來講, 只有關閉數據庫這個1個動作(還有dba手動執行 alter system checkpoint動作),? oracle會將data buffer cache中所有臟buffer寫入到dbf文件, 這樣數據庫的改動就被完整的保存下來了.
?????????????????????????
? ? ? ? ? ? ? ? ? ? ? ? ?? 所以, 在數據庫正常運行期間來, 是不會發生完全檢查點事件, 對應地, 會每3秒發生一次 增量檢查點
?????????????????????
? ? ? ? ? ? ? ? ? b. 增量檢查點(incremental checkpoint):
????????????? 這時CKPT 會將? check point queue上第一個臟buffer 的 LRBA地址 記錄到控制文件中.
????????????????? 而這個事件每3秒發生一次.
????????????????? 上面那個動作,是CKPT進程在增量檢查點主要的動作.
????????????????? 而實際上, CKPT在增量檢查點發生的時候還會做一件事情.
????????????????? 就是會檢查check point queue, 當它認為check point queue上的臟buffer過多的時候(其實數據庫所有臟buffer都在check point queue上啦),??? 就會把 觸發DBWR 把 checkpoint queue 上前幾個臟buffer 寫入到dbf 文件.???? 這樣就縮短了checkpoint queue 的長度.
????????????????? 也就是會所其實DBWR進程有若干種工作方式, 其中1種是把 LRUW chain中的冷端的臟buffer 寫入到 dbf文件. 另一種是在增量檢查點事件中被CPKT進程觸發, 將checkpoint queue中的前一部分臟buffer 寫入dbf文件.
?????????????? 3.5 on disk RBA 介紹
????????????? 我們可以用下面語句查看check point queue的一些信息:
????????????????? 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 列指的是當前checkpoint queue 上臟buffer的數量.
?????????????????????? Low RBA 是指checkpoint queue上 第1個臟buffer的 LRBA
??????????????????????
??????????????????????? 那么on disk RBA似是啥.
?
???????????????? 而我們知道其實Logbuffer 里面空間其實很小,而LGWR 進程不斷地將Logbuffer里面的日志寫入到 redo log文件中.
???????????????? 而redo log文件其實分組的. 當前被寫入的那一組就是current狀態(當前被寫入狀態)
???????????????? 那么current 狀態的redo log 文件記錄的最后一條日志的地址,? 也就是Current redo log文件最新的那一條日志地址就是On disk RBA了.
? ????????????? 其實就是被記錄到硬盤的最新那條日志地址啦.
?????????????? 我們可以見到On disk RBA 的值 比 LRBA的值要靠后一些,?? 證明上圖中checkpoint queen上的第一個臟buffer 已經被寫入到硬盤上了.
中間那條紅線是分割線.? 上面的日志已經被寫入redo log file,? 下面的日志還在Log buffer. 那么redo log file中最新的那個日志地址就是on disk RBA了,? 而整體checkpoint queen 的第1個buffer 的LRBA(就是整條checkpoint queue的LRBA) 地址比on disk RBA還早, 當然就已經寫入硬盤了.
??????
4. Check Point Queue的作用和意義 ????????? 見我的另外一篇文章?? checkpoint queue的作用與意義:
?http://blog.csdn.net/nvd11/article/details/8749393
?
http://v.youku.com/v_show/id_XNDAwOTY3MTU2.html
所做的學習筆記
1. LRU chain 和 LRUW chain 和 CBC chain
???? 先復習一下:
????
?
???????? 如上圖, 在database buffer cache中, 里面的buffer被若干條鏈串聯在一齊(通過頭尾部指針實現)
???????? LRU(Least recent used) chain
?????? 這是一條用于查找最近最少使用的buffer的鏈, 當buffer不夠用時會從這條鏈冷端找出buffer來重用.
???????? LRUW(Least recent used writed) chain
?????? 與上面那條LRC chain對應, 有一條專門for? 臟buffer的鏈, 而且是按最近修改次數排序的.
???????? DBWR后臺進程會將這條鏈的冷端buffers寫入dbf文件
???????? CBC(cache buffers chain)
?????? 根據buffer對應的block在dbf文件位置組織起來的鏈
?????? 這種鏈有很多條,? 如上圖,server process會根據block頭部信息算出對應的buffer在dababase buffer cache中的哪一條CBC中,然后遍歷出來.
???????
2.? Check Point Queue (檢查點隊列) chain
??????
?????? 這是按照第一次被修改的時間排列的臟buffer鏈.
????????? 注意2點:
??? ? ? ? 1, 里面都是臟buffer
????????? 2. 按照第一次被修改(變臟)時間排序
???????????????? 也就說有3個buffer?? 假如它們第一次修改時間分別是? 12:00 13:00 14:00, 那么它們就按照這個順序排序了, 假如15:00 時第1個buffer又被修改了,? 但是這時它們的順序不會變, 因為順序依據是第一次的被修改時間啊~?
3. Check Point Queue的內容和工作方式
?????? 這就是本文主要講的東西,? 不過要首先介紹幾個概念知識:
???????
??????????????? 3.1 RBA (Redo byte address)
???????????? 看名字就知道這是1個地址.
??????????????? 當database buffer cache里的1個buffer 被修改時, 也就是被變臟時就會產生日志, 而這些日志為被寫入到Log buffer cache(日志緩存里),? 那么這些日志在日志緩存里的位置就是RBA了.
??????????????? 而臟buffer會把對把對應的RBA記錄在自己的頭部信息中, 當這個臟buffer要被回滾時, server process就可以根據RBA找到對應的日志了.
?????????????? 而1個buffer的RBA并不是唯一的. 由于1個buffer可以在不同的時間段被多次修改, 就會產生多次日志, 而這些日志會被寫入到log buffer cache中的不同的位置. 所以往往1個buffer里面記錄著多個RBA.
?????????????
????????????? 3.2 LRBA (Low Redo byte address) 和 HRBA
?????????????LRBA是RBA的一種.?? 是對應臟buffer 第一次被修改的日志地址.? 而對應地 HRBA就是最近1次被修改的日志地址.
???????????????
????????????????
????????????? 3.3 Check Point Queue實際上是以臟buffer的LRBA順序鏈接起來的.
????????????? 剛才不是說是以第一次被修改的時間為序的嗎?
????????????????? 沒錯.? 而LRBA就是對應每個buffer第一次被修改的日志地址.
????????????????? 而且.? Oracle是嚴格按照日志的產生時間順序來寫日志的.?? 也就是地址靠后的日志產生時間肯定比地址靠前的日志產生時間要早.
????????????????
?????????????? 如下圖:
????????????????
?????????????????? 可以理解到, 當dirty buffer2在check point queue的位置比 dirty buffer1的位置靠后, 則代表 dirty buffer2的LRBA 肯定比 dirty buffer1 的LRBA 靠后.? 也即是 dirty buffer1 的第一次被修改時間比 dirty buffer2的第一次被修改時間早.
???????????????? 3.4 CKPT 進程.
????????????? checkpoint 進程也叫檢查點進程的, 以前都提過了, 是負責更新Oracle 控制文件的.
????????????????
??????????????
???????????????? 而CKPT有其中兩種事件:
???????????????? a. 完全檢查點 (completed checkpoint):
? ???????????? 這時CKPT進程 會 觸發 DBWR進程把 check point queue 上所有的臟buffer(也就是所有的臟buffer)寫入dbf文件.
??????????????????????
? ? ? ? ? ? ? ? ? ? ? ? ? 那么什么時候會出發這個完全檢查點的事件呢?? 很明顯,? 這個事件就是要將所有臟buffer寫入dbf files的事件.
????????????????????????? 通常來講, 只有關閉數據庫這個1個動作(還有dba手動執行 alter system checkpoint動作),? oracle會將data buffer cache中所有臟buffer寫入到dbf文件, 這樣數據庫的改動就被完整的保存下來了.
?????????????????????????
? ? ? ? ? ? ? ? ? ? ? ? ?? 所以, 在數據庫正常運行期間來, 是不會發生完全檢查點事件, 對應地, 會每3秒發生一次 增量檢查點
?????????????????????
? ? ? ? ? ? ? ? ? b. 增量檢查點(incremental checkpoint):
????????????? 這時CKPT 會將? check point queue上第一個臟buffer 的 LRBA地址 記錄到控制文件中.
????????????????? 而這個事件每3秒發生一次.
????????????????? 上面那個動作,是CKPT進程在增量檢查點主要的動作.
????????????????? 而實際上, CKPT在增量檢查點發生的時候還會做一件事情.
????????????????? 就是會檢查check point queue, 當它認為check point queue上的臟buffer過多的時候(其實數據庫所有臟buffer都在check point queue上啦),??? 就會把 觸發DBWR 把 checkpoint queue 上前幾個臟buffer 寫入到dbf 文件.???? 這樣就縮短了checkpoint queue 的長度.
????????????????? 也就是會所其實DBWR進程有若干種工作方式, 其中1種是把 LRUW chain中的冷端的臟buffer 寫入到 dbf文件. 另一種是在增量檢查點事件中被CPKT進程觸發, 將checkpoint queue中的前一部分臟buffer 寫入dbf文件.
?????????????? 3.5 on disk RBA 介紹
????????????? 我們可以用下面語句查看check point queue的一些信息:
????????????????? 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 列指的是當前checkpoint queue 上臟buffer的數量.
?????????????????????? Low RBA 是指checkpoint queue上 第1個臟buffer的 LRBA
??????????????????????
??????????????????????? 那么on disk RBA似是啥.
?
???????????????? 而我們知道其實Logbuffer 里面空間其實很小,而LGWR 進程不斷地將Logbuffer里面的日志寫入到 redo log文件中.
???????????????? 而redo log文件其實分組的. 當前被寫入的那一組就是current狀態(當前被寫入狀態)
???????????????? 那么current 狀態的redo log 文件記錄的最后一條日志的地址,? 也就是Current redo log文件最新的那一條日志地址就是On disk RBA了.
? ????????????? 其實就是被記錄到硬盤的最新那條日志地址啦.
?????????????? 我們可以見到On disk RBA 的值 比 LRBA的值要靠后一些,?? 證明上圖中checkpoint queen上的第一個臟buffer 已經被寫入到硬盤上了.
????????????????? 如下圖:
中間那條紅線是分割線.? 上面的日志已經被寫入redo log file,? 下面的日志還在Log buffer. 那么redo log file中最新的那個日志地址就是on disk RBA了,? 而整體checkpoint queen 的第1個buffer 的LRBA(就是整條checkpoint queue的LRBA) 地址比on disk RBA還早, 當然就已經寫入硬盤了.
??????
4. Check Point Queue的作用和意義 ????????? 見我的另外一篇文章?? checkpoint queue的作用與意義:
?http://blog.csdn.net/nvd11/article/details/8749393
?
總結
以上是生活随笔為你收集整理的Oracle 的检查点队列 (checkpoint queue)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博客会被搬去csdn
- 下一篇: C语言 利用malloc()和real