ORACLE的检查点(checkpoint)

时间:2021-05-31 07:43:38
检查点(checkpoint)


8.1 什么是checkpoint
checkpoint是数据库的一个内部事件,检查点激活时会触发数据库写进程(DBWR),将数据缓冲区里的脏数据块写到数据文件中。


8.2 checkpoint主要2个作用:


1)保证数据库的一致性,这是指将脏数据写出到硬盘,保证内存和硬盘上的数据是一样的。


2)缩短实例恢复的时间,实例恢复要把实例异常关闭前没有写到硬盘的脏数据通过日志进行恢复。如果脏块过多,实例恢复的时间也会过长,检查点的发生可以减少脏块的数量,从而减少实例恢复的时间。


8.3 checkpoint分类


完全检查点 full checkpoint
增量检查点 incremental checkpoint
局部检查点 partial checkpoint
查看检查点:select file#,checkpoint_change#,last_change# from v$datafile;
8.3.1 完全检查点工作方式:记下当前的scn, 将此scn之前所有的脏块一次性写完,再将该scn号同步更新控制文件和数据文件头。
 
可以引起完全检查点的四个动作  
  
a)正常关闭数据库:shutdown immediate
b)手动检查点切换:alter system checkpoint; 
c)日志切换:alter system switch logfile;
d)数据库热备模式:alter database begin backup; 


验证以上概念可以做一下alter system checkpoint,然后观察v$datafile和v$datafile_header中scn被更新。
另外,我们可以研究一下日志切换:alter system switch logfile; 


如果FAST_START_MTTR_TARGET<>0,v$log视图中的active状态几分钟后会变成inactive状态,然后更新了控制文件和日志文件头部的SCN。


8.3.2 增量检查点概念及相关参数:


8.3.2.1概念:


1)被修改过的块,在oracle中都被统称为脏块.脏块按照首次变脏的时间顺序被一个双向链表指针串联起来,这称做检查点队列。


2)当增量检查点发生时,DBWR就会被触发,沿着检查点队列的顺序将部分脏块刷新到磁盘上,每次刷新截止的那个块的位置就叫检查点位置,检查点位置之前的块,都是已经刷新到磁盘上的块。而检查点位置对应的日志地址(RBA)又总是被记录在控制文件中。如果发生系统崩溃,这个最后的检查点位置就是实例恢复运用日志的起点。


3)增量检查点使检查点位置前移。进而缩短实例恢复需要的日志起点和终点之间的距离,触发增量检查点越频繁,实例恢复的时间越短,但数据库性能受到频繁IO影响会降低。 


4)增量检查点不会同步更新数据文件头的SCN。


8.3.2.2 与增量检查点有关的几个知识点


1)FAST_START_MTTR_TARGET参数:


这个参数是考点。它给出了你希望多长时间恢复实例。


此参数单位为秒,缺省值0,范围0-3600秒,根据这个参数,Oracle计算出在内存中累积的dirty buffer所需的日志恢复时间,如果到达该参数指定的时间,则增量检查点进程被触发。该参数如果为0,ORACLE则会根据DBWN进程自身需要尽量减少写入量,这样虽然实现了性能最大化,但实例恢复时间可能会比较长。


早期还有几个有关增量检查点的参数,


log_checkpoint_interval 


规定了redo日志积累多少block(操作系统的block)后激活增量检查点,对用户来讲要给出这个参数不太方便,所谓block指的是os block,而不是oracle block。


log_checkpoint_timeout 给一个触发增量检查点的间隔,单位是秒。


如果设置了FAST_START_MTTR_TARGET参数,就不要用早期的一些参数,容易引起冲突。


*注意点:


如果将fast_start_mttr_target设置为非0,1)将启用检查点自动调整机制。2)log_checkpoint_interval参数将被覆盖掉。


2)90% OF SMALLEST REDO LOG(Oarcle 内部机制),从上次切换后算起,累计日志为一个日志组大小的90%时,做一次检查点切换。


3)每3s查看checkpoint队列脏块的写出进度,这个3秒是Oracle强调的增量检查点特性之一。注意,3s并不触发检查点,它只是记录当时的检查点位置,并将相关信息写入到controlfile。


8.3.3实例恢复有关的顾问叫做MTTR Advisory 需要设置两个参数


1)STATISTICS_LEVEL         -->置为typical(缺省) 或者all
2)FAST_START_MTTR_TARGET   -->置为非零值(FAST_START_IO_TARGET, LOG_CHECKPOINT_INTERVAL和 LOG_CHECKPOINT_TIMEOUT设为0)


8.3.4 设置合理的MTTR参数


查看视图 v$instance_recovery


SQL>select recovery_estimated_ios,actual_redo_blks,target_redo_blks,target_mttr,estimated_mttr from v$instance_recovery;


RECOVERY_ESTIMATED_IOS ACTUAL_REDO_BLKS TARGET_REDO_BLKS TARGET_MTTR ESTIMATED_MTTR
---------------------- ---------------- ---------------- ----------- --------------
                    72               333             3700           33             12


//系统计算出来的target_mttr为33秒,当前估算的恢复时间是12秒。




8.5 局部检查点的触发条件:


对于某些操作,局部检查点是必须的,并会自动执行。
比如:表空间offline,数据文件offline,删除extent,表truncate,begin backup(将表空间置于备份模式)等。Oracle会根据需要自动执行。