一、检查点队列 checkpoint queue:buffer cache里的一种chain,按照buffer第一次脏的时间将脏块链接起来,也能够叫lrba chain
检查点经过它来肯定,恢复时须要的重作日志。主要用于减小Crash Recovery 时间
RBA(Redo Byte Address), Low RBA(LRBA), High RBA(HRBA)
rba:被修改buffer的日志地址
lrba:buffer第一次脏的日志地址
hrba:最近一次脏的日志地址
lrba-hrba之间的日志就记录着该buffer的改变过程
on disk rba:是current日志组,最后一条日志的地址。html
二、ckpt进程工做方式
彻底检查点(全局):发生时,会触发DBWr将全部的脏块写入到磁盘,只有关闭数据库时发生。清理buffer cache和手动检查点
同时更新控制文件和数据文件头部检查点信息。
alter system checkpoint global;
select * from V$DATAFILE_HEADER; --彻底检查点信息
增量检查点:发生时,ckpt会周期性的将检查点队列的第一次脏的块的lrba写入控制文件,发现检查点队列1/4满,比较长,且
IO不是很繁忙会触发dbwr将检查点队列上比较早脏的块写入磁盘,缩短检查点队列,每隔3秒钟发生一次。只更新
控制文件中的检查点信息。
部分检查点(文件检查点):脱机只读热备份时发生,日志切换不必定就DBWR写脏块。
检查点:是一个数据库事件,发生检查点后,oracle会通知DBWR进程将checkpoint SCN以前的脏数据写入磁盘,写入完成后
CKPT进程更新控制文件和数据文件头部的记录检查点信息。
ckpt进程在促进DBWR写脏块时,块中数据可能不是同一个事务的修改。
一个事务产生的日志可能在log buffer里有,redolog里也有。可丢失的数据:未提交事务修改的数据,log buffer中的
日志对应的事务必定是没有提交的;不可丢失的数据:已提交事务修改的数据。
oracle实例恢复
oracle数据库若是发生了实例崩溃,再次启动数据库时,oracle会到控制文件中读取low cache rba(就是检查点位置)。
今后处开始应用磁盘上的重作日志,应用到on disk rba的位置,将数据库崩溃时的脏块给构造出来,构造出来的未提交事务对
应的块会再回滚。
空跑日志:当日志记录的SCN号比块的SCN小时会越过该修改数据库
三、增量检查点发生只是每3秒由CKPT进程去更新控制文件中的low cache rba信息,也就是检查点的位置。
查询检查点脏块信息
select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low RBA",
CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT from x$kcccp where indx=0;
CPDRT #检查点队列中的脏块数目,CPLRBA_SEQ及current日志组的序列号
CPODS #on disk rba的scn
CPODT #on disk rba的时间戳
CPHBT #心跳
补充X$KCCCP视图介绍:
X$KCCCP ——[K]ernel [C]ache [C]ontrolfile management [c]heckpoint [p]rogress
DESC X$KCCCP;
名称 是否为空? 类型
------------------ -------- --------------
ADDR RAW(4)
INDX NUMBER --一般只须要关心indx=0
INST_ID NUMBER
CPTNO NUMBER
CPSTA NUMBER
CPFLG NUMBER
CPDRT NUMBER --select count(*) from v$bh where dirty='Y';检查点队列中的脏块数
CPRDB NUMBER
CPLRBA_SEQ NUMBER ----最后一次增量检查点中LOW RBA中的序列号
CPLRBA_BNO NUMBER ----最后一次增量检查点在LOW RBA中的块数
CPLRBA_BOF NUMBER ----最后一次增量检查点在LOW RBA中的偏移量
CPODR_SEQ NUMBER ----已写入日志文件的最后一个RBA的序列号=current日志$log.sequence#
CPODR_BNO NUMBER ----已写入日志文件最后一个RBA的块数
CPODR_BOF NUMBER ----已写入日志文件最后一个RBA的偏移量
CPODS VARCHAR2(16) ---- on disk rba 的 scn
CPODT VARCHAR2(20) ---- on disk rba 的时间
CPODT_I NUMBER
CPHBT NUMBER -----心跳,每三秒钟加一
CPRLS VARCHAR2(16)
CPRLC NUMBER
CPMID NUMBER
CPSDR_SEQ NUMBER
CPSDR_BNO NUMBER
CPSDR_ADB NUMBEoracle
相关操做
alter system checkpoint;
alter system flush buffer_cache; --清空buffer cache和检查点队列
alter system archive log current;
alter system switch logfile;
select name,checkpoint_change#,current_scn from v$database;
select name,checkpoint_change# from v$datafile;
select name,checkpoint_change# from v$datafile_header;
select * from v$log;函数
四、SCN的意义?system change number系统改变号,将时间经过函数计算出来的数字,方便比较前后、新旧
时间与SCN互转
select dbms_flashback.get_system_change_number,
SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;.net
五、常见的SCN
控制文件
系统SCN, current_scn 当前数据库最大的SCN号
select checkpoint_change# from v$database;
文件SCN,开始、结束SCN
select name,checkpoint_change#,last_change# from v$datafile; --多个文件与系统SCN相同,数据文件头部
数据文件头部,开始SCN
select name,checkpoint_change# from v$datafile_header;
数据库正常关闭时,系统SCN,文件SCN,结束SCN,开始SCN值相同;
数据库正常使用时:文件开始SCN和文件SCN,系统SCN相同,结束SCN为空或者无穷大;
非正常关闭时:结束SCN为空,以此来判断数据库是否正常关闭;
数据库从新启动后SCN号都会改变
日志文件也有SCN号,v$log.FIRST_CHANGE#,同时每条日志条目也有SCN,跑日志时比对,数据库正常时SCN号与最老的active
日志的SCN相同
select recid,sequence#,first_change#,next_change# from v$log_history where rownum<6;日志
六、fast_start_mttr_target 参数
默认便可0单位是秒,定义数据库启动时实例恢复的时限,检查点队列会根据该值调整队列长度和DBWR的写频率,确保在
指定时间里完成实例恢复。设为1和3600看那个值最接近中间值,肯定大小。oracle 10G 将该参数设置为0时数据库会根据系
统负载自动检查点调整
alter system set fast_start_mttr_target=3600[1];
select TARGET_MTTR,ESTIMATED_MTTR from v$instance_recovery;--数据库评估的MTTR大小
select * from v$mttr_target_advice; --MTTR大小设置建议htm
参考文件:
http://www.cnblogs.com/luoyx/archive/2011/12/27/2302960.html
http://www.cnblogs.com/Ronger/archive/2011/12/09/2281650.html
http://blog.csdn.net/robinson1988/article/details/5087993blog