2字节为Wrap(进位值)+4字节为Base(底值)
select current_scn,dbms_flashback.get_system_change_number,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),scn_to_timestamp(dbms_flashback.get_system_change_number) from v$database;
(1)控制文件序列号
该序列号是判断控制文件是否过“旧”的要素之一,在控制文件被更新(检查点信息更新、创建删除表空间等)之后就会增长。
select controlfile_sequence# from v$database; --当前控件文件记录的序列号
select hxfil as file#,FHCSQ from x$kcvfh; --当前数据文件头部中记录的控制文件序列号
当然Oracle不会只依赖控制文件序列号判断控制文件是否是“旧”的,还依赖控制文件检查点SCN号,序列号只是用来短路该判断,如果序列号校验没通过,就没必要校验控制文件检查点SCN号了。
该序SCN也是判断控制文件是否过“旧”的要素之一,控制文件检查点SCN必须大于或等于所有数据文件头部的检查点SCN号,否则,控制文件同样被认为是“旧”的,实例恢复无法启动
select controlfile_change# from v$database;
--完全检查点把SCN更新至数据文件头和控制文件中
--增量检查点仅把SCN号更新至控制文件中
控制文件中保存的数据库检查点SCN号实际上在所有数据文件头部中最小的检查点SCN。它是数据文件状态的一个缩影,根据它的值与每个重做日志的高、低位SCN比较,Oracle可以确定恢复文件需要使用的第一个日志文件。
select checkpoint_change# from v$database;--这个值来自于v$datafile_header.checkpoint_change#的最小值
select name,checkpoint_change# from v$datafile;
select name,last_change# from v$datafile;
select name,checkpoint_change# from v$datafile_header;
col LRBA for a30
col OndiskRBA for a30
select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "LRBA",CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "OndiskRBA",CPODS from x$kcccp;
日志文件中的重做记录范围是由这两个SCN来表示的。
select first_change#,next_change# from v$log; --v$log_history
(9)数据块中的SCN
(1)数据正常运行时:控制文件中的系统检查点scn、控制文件中的数据文件检查点scn和每个数据文件头中的启动scn都是相同的
(2)控制文件中的每个数据文件的终止scn都为无穷大FFFFFFFFFFFFFF
(3)正常关闭数据库的过程中,系统会执行一个检查点动,这时所有数据文件的终止scn都会设置成数据文件头中的那个启动scn的值
(4)在数据库重新启动的时,Oracle将执行两次检查
a.看数据文件头中的ckpt计数器是否与对应控制文件中的ckpt计数器一致,若相等,进行第二次检查
b.比较文件头中的启动scn和对应控制文件中的终止scn进行比较,如果终止scn等于启动scn,则不需要对那个文件进行恢复
(5)数据库打开之后,存储在控制文件中的数据文件终止scn的值再次被更改为FFFFFFF,这表示数据文件已经打开并能够正常使用了
注:非正常关闭数据库时不进行检查点处理,终止scn仍然为无穷大。在下次启动期间,发现启动scn和终止scn不同,需要实例恢复。
(1)只要数据库被修改,SCN就会+1,而不是一定要进行checkpoint,例如DML的发生即使没有提交也会使SCN+1
(2)如果一个DML导致产生事务,则会产生一个SCN
(3)Oracle 10g内部的SCN会默认不管有没有动作,每隔3s自动增加一次
(4)只有ckpt进程才会修改文件头中的checkpoint计数器和SCN,DBWR只会修改数据块,即ckpt通知dbwr写数据文件,写完之后ckpt更新控制文件和数据文件头
*****************************************************************************
相关操作
alter system checkpoint;
alter system switch logfile
select checkpoint_change# from v$database
select name,checkpoint_change# from v$datafile
select name,checkpoint_change# from v$datafile_header
select * from v$log;
**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
Name: guoyJoe
QQ: 252803295
Email: [email protected]
Blog: http://blog.csdn.net/guoyJoe
ITPUB: http://www.itpub.net/space-uid-28460966.html
OCM: http://education.oracle.com/education/otn/YGuo.HTM
_____________________________________________________________