Oracle Redo Log和CheckPoint详解

LogBuffer写入Redo Log的条件:
1).用户提交
2).有1/3重做日志缓冲区未被写入磁盘(可以通过修改_LOG_IO_SIZE参数来控制 )
3).有大于1M的重做日志缓冲区未被写入磁盘
4).每隔3 秒钟
5). DBWR 需要写入的数据的SCN大于LGWR记录的SCN,DBWR 触发LGWR写入。

LGWR写的具体过程:
1).先尝试获取redo writing latch,确保其他process不会继续触发lgwr(这里可能会产生log file sync等待事件)
2).获取redo allocation latch(public redo allocation latch),防止有新的change vector继续写入log buffer,造成LGWR无法确定应该写多少redo.
3).LGWR确定写的范围(从上次lgwr启动所写的最后一个日志块到这个时间点时的最后一个被使用的所有写满or未写满的日志块)此时前台process仍可以向这个范围内的redo block(buffer)写内容(从PGA写)所以lgwr不阻碍其它进程获得redo copy latch(即:不阻止其它进程向log buffer 中可用块中写change vector)
4).确定redo block(buffer)后生成新SCN号
5).LGWR释放redo allocation latch与redo writing latch
6).LGWR需要等待 其它进程对要写入日志文件的block的更新操作完成(pga-log buffer的操作),通过判断日志block(buffer)上的redo copy latch是否都释放。
7).将第4步scn号copy到要写入logfile的log buffer的块头里,然后触发物理的写操作,将这些待写日志块写入redo file

CheckPoint发生的条件:
1).当发生日志组切换的时候。
2).当符合LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,fast_start_io_target,fast_start_mttr_target参数设置的时候。
3).当运行ALTER SYSTEM SWITCH LOGFILE的时候。
4).当运行ALTER SYSTEM CHECKPOINT的时候。
5).当运行alter tablespace XXX begin backup,end backup的时候。
6).当运行alter tablespace ,datafile offline的时候。
7).shutdown时
8).ckpt进程每3s起来一次记录checkpoint的进度到控制文件中

Redo Log切换条件:
1).Redo Logfile 满
超过archive_lag_target(默认不设置)
2).checkpoint

checkpoint负责:通知DBWn进程;update数据文件头;update控制文件。

checkpoint主要2个作用:
1).保证数据库的一致性,这是指将脏数据写入到硬盘,保证内存和硬盘上的数据是一样的;
2).缩短实例恢复的时间,实例恢复要把实例异常关闭前没有写出到硬盘的脏数据通过日志进行恢复。如果脏块过多,实例恢复的时间也会很长,检查点的发生可以减少脏块的数量,从而提高实例恢复的时间。

Check Point 和 Redo Log相关参数:

log_checkpoint_interval
设定两次checkpoint之间重做日志块(重做日志块和系统数据块是一样的)数,当重做日志块数量达到设定值的时候将触发checkpoint。

log_checkpoint_timeout
设定两次checkpoint之间的间隔时间,当超时值达到时增量checkpoint将被触发。Oracle建议不用这个参数来控制,因为事务(transaction)大小不是按时间等量分布的。将此值设置成0时将禁用此项设置。

fast_start_io_target
因为log_checkpoint_interval主要看的时候重做日志块的数量,并不能反应buffer cache中脏数据块的修改,因此Oracle又引入了这个参数来实现当脏数据块达到一定数量的时候触发checkpoint,不过此参数实际上控制的是恢复时所需IO的数量。

fast_start_mttr_target
此参数是在9i中引入用来代替前面的三个参数的,它定义了数据块崩溃后所需要的实例恢复的时间,Oracle在实际上内在的解释成两个参数:fast_start_io_target和log_checkpoint_interval.如果这两个参数没有显式的指定,计算值将生效.。
fast_start_mttr_target可以设定的最大值是3600,即一个小时。它的最小值没有设限,但是并不是说可以设置一个任意小的值,这个值会受最小dirty buffer(最小为1000)的限制,同时还会受初始化时间以及文件打开时间的限制。
在设置此参数的时候要综合考虑系统的IO,容量以及CPU等信息,要在系统性能和故障恢复时间之间做好平衡。
将此参数设置成0时将禁用 fast-start checkpointing,这样能见效系统负载但同时会增加系统的恢复时间。
如果fast_start_io_target or log_checkpoint_interval被指定,他们会自动覆盖由fast_start_mttr_target参数计算出来的值。

通过查看V$INSTANCE_RECOVERY动态性能视图可以查看一些MTTR相关的信息。

SELECT TARGET_MTTR,ESTIMATED_MTTR,CKPT_BLOCK_WRITES,CKPT_BLOCK_WRITES FROM V$INSTANCE_RECOVERY;

TARGET_MTTR
用户设置的参数FAST_START_MTTR_TARGET的值.

ESTIMATED_MTTR
根据目前脏块数目和日志块数目,评估的现在进行恢复所需要的时间.

CKPT_BLOCK_WRITES
检查点写完的块数目.

CKPT_BLOCK_WRITES
额外的因为检查点引起的数据库写入操作 (因为不必要的检查点的产生,设置一个非常小的系统恢复时间将会对性能产生负面影响,为了帮助管理员监测这个参数设置较小时对数据库的影响,这个视图显示了这个列)

##相关表
V$DATAFILE_HEADER
查看数据文件的完全checkpoint信息。

V$INSTANCE_RECOVERY
查看fast_start_mttr_target设置以及系统MTTR相关信息。

X$BH
用于查看脏块的LRBA和HRBA(There is also a recovery RBA which is used to record the progress of partial block recovery by PMON.) 。

X$TARGETRBA
查看增量checkpoint RBA,target RBA和on-disk RBA。

X$KCCCP
这里面也有增量checkpoint RBA,target RBA的信息。

X$KCCRT
完全checkpoint(full thread checkpoint)RBA信息。

开启trace日志

ALTER SYSTEM SET LOG_checkpointS_TO_ALERT=TRUE;


猜你喜欢

转载自blog.51cto.com/693817/2644772