下面假设一个实例恢复的例子:
Table表每行2000个字节,块大小8K,每块可容纳table的3行,按如下发布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
上面七条更新命令后,每块状态为:
Lrba就是块首次变脏时的RBA,而Hrba,是最后一次改变块中信息,所对应的重做记录的RBA。1号块外被修改两次,Lrba和Hrba不同。2到5号块只被修改一次,Lrba和Hrba相同。
相应的重做记录有:
假如此时,1号块和2号块已经变得不脏,3、4、5号块仍是脏块,所有的脏块依Lrba顺序按列为检查点队列,其中检查点队列头(此处是3号块)的Lrba就是检查点位置,此处为692.3033.10。这个值被记录在控制文件中。如果发生了实例崩溃,Oracle将从控制文件中取出692.3033.10,到692号重做日志中,找到第3033块,从此处开始,应用所有的重做日志,直到重做日志文件的最未尾。而重做日志文件的最未尾重做记录的RBA,又叫On disk rba。从检查点位置处,应用重做记录到On disk rba处,这个过程就是前滚。
如下几个参数可以用来限制检查点队列的长度:
(1)fast_start_io_target
该参数用于表示数据库发生Instance Recovery 的时候需要产生的IO总数,他通过v$filestat的AVGIOTIM来估算的.比如我们一个数据库发生Instance Crash后需要在10分钟内恢复完毕,假定OS的IO每秒为500个,那么这个数据库发生Instance Recovery的时候大概产生500*10*60=30,000次IO,也就是我们将可以把fast_start_io_target设置为30000.
(2)fast_start_mttr_target
我们从上面可以看到fast_start_io_target来估算检查点位置比较麻烦.oracle为了简化这个概念,从9I开始引入了fast_start_mttr_target这么一个参数,用于表示数据库发生Instance Recovery的时间.以秒为单位,这个参数我们从字面上也比较好理解,其中的mttr是mean time to recovery的简写,如上例中的情况我们可以将fast_start_mttr_target设置为600.当设置了fast_start_mttr_target后,fast_start_io_target这个参数将不再生效,从9I后fast_start_io_target这个参数被oracle废除了.
(3)log_checkpoint_timeout
该参数用于表示检查点位置和重做日志尾之间的时间间隔,以秒为单位,默认情况下是1800秒,这个参数实际上表示了脏块保持脏状态的最长时间.如果它被定为1800秒,没有脏块保持1800秒后,还是为脏.
设log_checkpoint_timeout 为1800秒
相比fast_start_mttr_target,它也是时间,但它的时间值表示完成恢复操作所需要的时间,即从最后的检查点位置开始,应用所有日志直到日志末尾所需要的时间.而本参数表示从最后的检查点位置开始,到日志末尾经过的时间. 在标准版中,本参数的最小值是900.
(4)log_checkpoint_interval
该参数是表示检查点位置和重做日志末尾的块的数量.以OS表示.
5,90% OF SMALLEST REDO LOG
Oracle内部事实上还将重做日志末尾前面90%的位置设为检查点位置,这不是一个参数,这是oracle内部规定的一个触发增量检查点的事件. 上面这些条件,严格来说,并不是控制检查点什么时候发生,而是控制检查点队列中可以有多少个块.在前4个参数中,9I中oracle推荐使用fast_start_mttr_target替代第一个 fast_start_io_target.
fast_start_mttr_target,log_checkpoint_timeout,log_checkpoint_interval和90% OF SMALLEST REDO LOG 可以同时使用.考虑这样一种情况,如果上面的这些触发增量检查点的参数都被设置,并且在某一时刻,这几个参数一起被触发,但他们指定的Target RBA位置可能不尽相同,oracle将离日志末尾最近的那个位置认为检查点位置,如下图所示:
在这种情况下,将会把log_checkpoint_interval的位置定为下一增量检查点的Target RBA.
在9I后,对检查点频率,建议只设置fast_start_mttr_target.根据需要,也可以通过设置log_checkpoint_timeout,设置一个脏块保持脏状态的最大时间,而其他两个参数fast_start_io_target,log_checkpoint_interval建议不再使用.
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html