没有必胜的秘籍,没有方程式遵循~~
要赢~~只有全身心的投入!
晶晶实验九之详细论述增量检查点篇
上一篇 / 下一篇 2008-03-03 02:15:22 / 个人分类:晶晶oracle实验系列
查看( 516 ) /
评论( 63 )
晶晶实验九之详细论述增量检查点篇
P.qrKDb t0 **为什么要有检查点?
\%Z/m2O s{0`0 被修改过的块,在oracle中都被统称为脏块.所有的脏块被一个链表串起来,称做检查点队列.在buffer ITPUB个人空间J"_$H3~M/Ww-O
cache中,每一个块都有一个buffer header 简称BH,在BH中有一个ckptq项,此项目中记录了指向检查点队
Ui&p5d`0 列上一个块和下一个块的指针.如果某一个块不在检查点队列中,他的ckptq项为空.通过ckptq项oracle将ITPUB个人空间CjZ_:l7Xs[m
所有的脏块串成了一个双向链表.这个双向链表就是检查点队列了.
!d;^ iW'X)ze/~6q q G0 1,只有脏块才会在检查点队列中,非脏块的ckptq为空.
x\S`-Y\0 2,当块首次被更改时,块会立即被加进检查点队列.如果检查点队列中的脏块再次被修改,并不会改变其在
6^?6eG+OR0 检查点队列中的位置.
9IsiV9Sek&j z0 3,检查点队列中脏块的排列顺序:根据第2点,所有脏块按照首次被更改的时间的顺序排列.更准确点说:按
@l/_R/mXh0 照块的lrba排列.ITPUB个人空间#M,|1s!u3t^tXv
**什么是rba?lrba?hrba?
L$yZ$aLy"w6|0 rba就是重做块地址,比如说,用户发出了一条update命令,更新了块A,块A现在变成了脏块,oracle会为他
A"uL iy5H[K8a]0 生成一条重做记录.这条重做记录在重做日志文件中的位置就是rba(redo block address).过了一会儿,假
Q_,U+x6d#B1T#qw0 如:块A依然还是脏块,此时.用户又发出一条更新块A的命令,这又会生成一条重做记录.第一条更新命令对
t%p.EG O0 应的重做记录的rba被称为块A的lrba(low rba),第二条更新命令对应的rba,被称为hrba(high rba).
'O(V},~al$w0uW0 其实,按照lrba来排列,就是按照块首次被修改的顺序来排列.
eG6x6p9GE0 下面说说DBWR写脏块的方式,有了检查点队列之后,脏块按照首次变脏的时间顺序排列,DBWR每到一定的ITPUB个人空间9b y,L&CpiF
时机,就会被触发,沿着检查点队列的顺序刷新脏块,具体在oracle中有几个参数用来确定检查点队列的长ITPUB个人空间w"L [ _O5v!\3c"P
度.另有一个CKPT进程,会监控着检查点队列的长度,当检查点队列的长度达到一定限制时,CKPT会通知DBWRITPUB个人空间%xdxpQ5lhY
写脏块.CKPT会根据参数的设置和I/O的速度以及繁忙程度,计算出来一个Target rba(目标rba),DBWR会沿
0@W'`h#m vo0 着检查点队列,将所有Target rba之前的脏块刷新到磁盘.当CKPT通知完DBWR Target rba后,CKPT的任务就ITPUB个人空间xY|v#O1\9B
结束了.他并不会等待DBWR写完所有的Target rba之前的脏块.通知DBWR写脏块,这是CKPT的任务之一,CKPT
a!fk-c3_Q*r Qh0 另有一个任务,就是每3秒,检测一次DBWR的写进度.检查点队列最前面的块被称为检查点位置.DBWR是沿着ITPUB个人空间yhMpDg `'g
检查点队列写脏块的,CKPT每3秒钟查看一下DBWR沿检查点队列写到了哪里,并且将这个位置设置为检查点ITPUB个人空间0THhG9^[,i
位置.也就是说检查点位置之前的块,都是已被DBWR刷新到磁盘上的块.这个3秒一次检查DBWR进度的工作,ITPUB个人空间~]F&X{r8X\#G%i0w
也是CKPT的一个重要的任务.CKPT每3秒一次将检查点位置记录进控制文件,当然同时被记录进控制文件的
imN*c,Hfj&_0[0 还有'心跳'等其他信息.CKPT每3秒一次的工作和CKPT定期触发DBWR,这两项操作合一起被称为--增量检查ITPUB个人空间M?lx1ak
点.ITPUB个人空间$wp\(vBa _
下面的就是CKPT每3秒写进控制文件的信息ITPUB个人空间 R/k:R!~IF#` m G
SQL> alter session set events 'immediate trace name controlf level 8';
1aAhrSEx0 会话已更改。
;pQC$f#?e vQ4P0 具体内容如下:
!JP8` o y#Kx~3]0 ***************************************************************************ITPUB个人空间+w3p5V4fP
CHECKPOINT PROGRESS RECORDS
V2D vZ!F$L:Ta0 ***************************************************************************
n IC8@|0 (size = 8180, compat size = 8180, section max = 11, section in-use = 0,
!ca,U3AD0 last-recid= 0, old-recno = 0, last-recno = 0)ITPUB个人空间B#r I/L*jb:~:aS
(extent = 1, blkno = 2, numrecs = 11)
;@}!u] c fK0 THREAD #1 - status:0x2 flags:0x0 dirty:89ITPUB个人空间-g*X)H'}NCN;WS1qT4z
low cache rba
0x2ad.908.0)[检查点位置] on disk rba
0x2ad.d2f.0)[最后一条重做记录的rba]ITPUB个人空间(ac{g&{7p1V
o
on disk scn: 0x0000.00237745 03/02/2008 15:03:44[最后一条重做记录的scn]
3~iNDO0 resetlogs scn: 0x0000.0008297b 08/27/2007 09:51:58ITPUB个人空间[/V3mm[-J7A
heartbeat: 648318959[心跳] mount id: 1201288562ITPUB个人空间1pJWnP3@l$} N
...
j ~;xC%x rym0 ...
@|"z+a]X0 这里面的大多数信息可以通过x$kcccp中看到.
%_"q;F3| W5e0 SQL> select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low ITPUB个人空间k%YGdzY)X8Qs
RBA",CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT from x$kcccp;ITPUB个人空间 i#P'Q{5V5ZB
CPDRT Low RBA On disk RBA CPODS CPODT CPHBT
Z'yRri y Am0 ---------- --------------- --------------- ---------------- -------------------- ----------ITPUB个人空间d'VV&G"d
35 686.124.0 686.220.0 2325376 03/02/2008 15:18:54 648319278ITPUB个人空间W+Y]n a Q0aN
说明:
hESWa0 CPDRT列是检查点队列中的脏块数目.
8yG'[e t0 CPODS列是on disk rba的scnITPUB个人空间rIS9I+`i2u9e*b
CPODT列是on disk rba的时间戳ITPUB个人空间0UMro MGa
CPHBT列是心跳ITPUB个人空间2k8U+Lb |(MG
检查点位置是是个rba,他指向着重做日志文件中的某个重做记录.在此位置前的重做记录,其对应的信息已
|bFe [ D;h0 经被写进了数据文件,在此位置后的重做记录,所对应的是数据块,有可能还在内存中.如果发生了实例崩溃
&jOa/S QE&F
P.qrKDb t0 **为什么要有检查点?
\%Z/m2O s{0`0 被修改过的块,在oracle中都被统称为脏块.所有的脏块被一个链表串起来,称做检查点队列.在buffer ITPUB个人空间J"_$H3~M/Ww-O
cache中,每一个块都有一个buffer header 简称BH,在BH中有一个ckptq项,此项目中记录了指向检查点队
Ui&p5d`0 列上一个块和下一个块的指针.如果某一个块不在检查点队列中,他的ckptq项为空.通过ckptq项oracle将ITPUB个人空间CjZ_:l7Xs[m
所有的脏块串成了一个双向链表.这个双向链表就是检查点队列了.
!d;^ iW'X)ze/~6q q G0 1,只有脏块才会在检查点队列中,非脏块的ckptq为空.
x\S`-Y\0 2,当块首次被更改时,块会立即被加进检查点队列.如果检查点队列中的脏块再次被修改,并不会改变其在
6^?6eG+OR0 检查点队列中的位置.
9IsiV9Sek&j z0 3,检查点队列中脏块的排列顺序:根据第2点,所有脏块按照首次被更改的时间的顺序排列.更准确点说:按
@l/_R/mXh0 照块的lrba排列.ITPUB个人空间#M,|1s!u3t^tXv
**什么是rba?lrba?hrba?
L$yZ$aLy"w6|0 rba就是重做块地址,比如说,用户发出了一条update命令,更新了块A,块A现在变成了脏块,oracle会为他
A"uL iy5H[K8a]0 生成一条重做记录.这条重做记录在重做日志文件中的位置就是rba(redo block address).过了一会儿,假
Q_,U+x6d#B1T#qw0 如:块A依然还是脏块,此时.用户又发出一条更新块A的命令,这又会生成一条重做记录.第一条更新命令对
t%p.EG O0 应的重做记录的rba被称为块A的lrba(low rba),第二条更新命令对应的rba,被称为hrba(high rba).
'O(V},~al$w0uW0 其实,按照lrba来排列,就是按照块首次被修改的顺序来排列.
eG6x6p9GE0 下面说说DBWR写脏块的方式,有了检查点队列之后,脏块按照首次变脏的时间顺序排列,DBWR每到一定的ITPUB个人空间9b y,L&CpiF
时机,就会被触发,沿着检查点队列的顺序刷新脏块,具体在oracle中有几个参数用来确定检查点队列的长ITPUB个人空间w"L [ _O5v!\3c"P
度.另有一个CKPT进程,会监控着检查点队列的长度,当检查点队列的长度达到一定限制时,CKPT会通知DBWRITPUB个人空间%xdxpQ5lhY
写脏块.CKPT会根据参数的设置和I/O的速度以及繁忙程度,计算出来一个Target rba(目标rba),DBWR会沿
0@W'`h#m vo0 着检查点队列,将所有Target rba之前的脏块刷新到磁盘.当CKPT通知完DBWR Target rba后,CKPT的任务就ITPUB个人空间xY|v#O1\9B
结束了.他并不会等待DBWR写完所有的Target rba之前的脏块.通知DBWR写脏块,这是CKPT的任务之一,CKPT
a!fk-c3_Q*r Qh0 另有一个任务,就是每3秒,检测一次DBWR的写进度.检查点队列最前面的块被称为检查点位置.DBWR是沿着ITPUB个人空间yhMpDg `'g
检查点队列写脏块的,CKPT每3秒钟查看一下DBWR沿检查点队列写到了哪里,并且将这个位置设置为检查点ITPUB个人空间0THhG9^[,i
位置.也就是说检查点位置之前的块,都是已被DBWR刷新到磁盘上的块.这个3秒一次检查DBWR进度的工作,ITPUB个人空间~]F&X{r8X\#G%i0w
也是CKPT的一个重要的任务.CKPT每3秒一次将检查点位置记录进控制文件,当然同时被记录进控制文件的
imN*c,Hfj&_0[0 还有'心跳'等其他信息.CKPT每3秒一次的工作和CKPT定期触发DBWR,这两项操作合一起被称为--增量检查ITPUB个人空间M?lx1ak
点.ITPUB个人空间$wp\(vBa _
下面的就是CKPT每3秒写进控制文件的信息ITPUB个人空间 R/k:R!~IF#` m G
SQL> alter session set events 'immediate trace name controlf level 8';
1aAhrSEx0 会话已更改。
;pQC$f#?e vQ4P0 具体内容如下:
!JP8` o y#Kx~3]0 ***************************************************************************ITPUB个人空间+w3p5V4fP
CHECKPOINT PROGRESS RECORDS
V2D vZ!F$L:Ta0 ***************************************************************************
n IC8@|0 (size = 8180, compat size = 8180, section max = 11, section in-use = 0,
!ca,U3AD0 last-recid= 0, old-recno = 0, last-recno = 0)ITPUB个人空间B#r I/L*jb:~:aS
(extent = 1, blkno = 2, numrecs = 11)
;@}!u] c fK0 THREAD #1 - status:0x2 flags:0x0 dirty:89ITPUB个人空间-g*X)H'}NCN;WS1qT4z
low cache rba
0x2ad.908.0)[检查点位置] on disk rba
0x2ad.d2f.0)[最后一条重做记录的rba]ITPUB个人空间(ac{g&{7p1V
oon disk scn: 0x0000.00237745 03/02/2008 15:03:44[最后一条重做记录的scn]
3~iNDO0 resetlogs scn: 0x0000.0008297b 08/27/2007 09:51:58ITPUB个人空间[/V3mm[-J7A
heartbeat: 648318959[心跳] mount id: 1201288562ITPUB个人空间1pJWnP3@l$} N
...
j ~;xC%x rym0 ...
@|"z+a]X0 这里面的大多数信息可以通过x$kcccp中看到.
%_"q;F3| W5e0 SQL> select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low ITPUB个人空间k%YGdzY)X8Qs
RBA",CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT from x$kcccp;ITPUB个人空间 i#P'Q{5V5ZB
CPDRT Low RBA On disk RBA CPODS CPODT CPHBT
Z'yRri y Am0 ---------- --------------- --------------- ---------------- -------------------- ----------ITPUB个人空间d'VV&G"d
35 686.124.0 686.220.0 2325376 03/02/2008 15:18:54 648319278ITPUB个人空间W+Y]n a Q0aN
说明:
hESWa0 CPDRT列是检查点队列中的脏块数目.
8yG'[e t0 CPODS列是on disk rba的scnITPUB个人空间rIS9I+`i2u9e*b
CPODT列是on disk rba的时间戳ITPUB个人空间0UMro MGa
CPHBT列是心跳ITPUB个人空间2k8U+Lb |(MG
检查点位置是是个rba,他指向着重做日志文件中的某个重做记录.在此位置前的重做记录,其对应的信息已
|bFe [ D;h0 经被写进了数据文件,在此位置后的重做记录,所对应的是数据块,有可能还在内存中.如果发生了实例崩溃
&jOa/S QE&F