关于检查点的一点具体应用讨论(3)
来源: www.ixdba.net 
作者: IXDBA.NET官方
时间:2006-09-30 阅读:32
本文章共5242字,分4页,当前第3页,快速翻页:1 2 3 4
scn, 则跳过此 change vector, 否则 redo 。
数据块中 ITL 中还有 SCN, 但它的作用是用于产生一致性读快照。
commit 的时候加一,其他很多时候也会加 1 ,只要数据库发生了变化都会增加。很多时候,能否举一些例子?
解答:
dml一发生即使没有提交也会增加 scn, job 进程一样产生 scn, 只要对数据库中文件发生任何的改变都有可能产生 scn,SCN: system change number, not system commit number . 也就是 系统发生变化 所产生的一个时间点标志。不是提交的标志,只是因为提交也是系统的变化之一而已。 IXDBA.NET社区论坛
这句话我应该更准确第表达一下:
如果一个 dml 导致产生事务,则会产生一个 scn 。这个意思是说
如果一个事务包含多个 dml ,则只有第一个初始产生事务的 dml 产生 scn ,提交的时候又是一个 scn 。
如果一个事务只有一个 dml ,那么看起来就是 dml 产生一个 scn ,提交或者回滚产生一个 scn 。
所以可以把结论定义为 事务的开始 和事务的结束都会导致 SCN 的增加,同一个 block 上在一个事务中连续发生 255 个 DML 后 scn 也会增加。
检查点的发生和日志的关系:
解答:
检查点的发生,跟写日志文件是没有必然联系的。
检查点发生,通知 DBWR 写数据文件,写完后 ckpt 更新控制文件和数据文件头。
当 DBWR 写 数据块的时候若发现 数据块的 相关 RDBA ( 位于日志文件的位置 ) 的 log block 还没有被写入日志文件,则在 dbwr 写块之前必须通知 llgwr 把 log buffer 中日志写入日志文件。
关于检查点等待事件:
有些事件的产生必须等待检查点的完成,才能开始数据库的其它操作:
日志文件切换就是其中一个事件,日志切换必须等待检查点完成。
log file switch (checkpoint incomplete) 这个等待事件本身也说明,日志切换时产生的检查点是需要等待的,这个日志文件所对应脏块全部写完后,检查点进程更新控制文件和数据头,然后这个检查点才能算完成。
也就是说日志切换必须等待检查点完成,而检查点在等待 DBWn 完成。
这种等待 DBWn 完成的检查点,最后一步写入控制文件和数据文件头的 SCN ,肯定是 DBWn 完成的最后一块的 SCN 。
检查点为什么要等待 dbwr 完成后才进行切换( log switch )?
log switch时,是不能立即 switch 到 active 状态的, log group 必须等待。 active 表示该 log group 还没有完成归档(归档模式下)或者该 log group 有进行 instance recovery 的需要用到的日志。所以当 checkpoint 发生时,如果 dbwr 还没有写完它该写完的 dirty buffers (该 checkpoint 时间点以前产生的 dirty buffers, 靠 scn 判断),则该 log group 处于 active 状态,不会进行日志切换,当然也不会发生日志文件被覆盖的问题了。
如果没有设置 archive log ,在检查点发生后,发生 log switch 一个轮回, log file 是否会被覆盖掉?
当检查点发生后,会触发 lgwr , lgwr 会把此时 SCN 以前在 redo buffer 中的所有操作写到 redo log file ,同时 lgwr 也会触发 dbwr 进程, dbwr 也开始把此刻以前 database buffer 中的 dirty buffer 队列中的操作写入 data file 。
其实检查点发生后,就是 lgwr 和 dbwr 写 buffer 到磁盘文件的过程,但是两者的读写速度时不同的, dbwr 写 buffer 到数据文件的过程相对较慢,因为 dbwr 写过程是一个随机读取存储的过程。 Lgwr 写 buffer 到 redo 文件的过程比 dbwr 要快很多,因为 lgwr 是顺序读取写入的。
由于以上 lgwr 和 dbwr 写操作的速度不同,就产生了一个等待问题。即当 lgwr
轮循一圈后,要进行日志切换,覆盖 redo log file ,但是此时 dbwr 还没有写完,那么
阅读更多内容 :<<上一页 · 1 · 2 · 3 · 4 · 下一页>>