网上也有很多人在讨论SCN,下面我把各种SCN一一做简单介绍,欢迎大家一起探讨。
1、SCN是什么?(system change number/system commit number)
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;
2、SCN的介绍
(1)控制文件序列号
该序列号是判断控制文件是否过“旧”的要素之一,在控制文件被更新(检查点信息更新、创建删除表空间等)之后就会增长。
select controlfile_sequence# from v$database; --当前控件文件记录的序列号
select hxfil as file#,FHCSQ from x$kcvfh; --当前数据文件头部中记录的控制文件序列号
当然Oracle不会只依赖控制文件序列号判断控制文件是否是“旧”的,还依赖控制文件检查点SCN号,序列号只是用来短路该判断,如果序列号校验没通过,就没必要校验控制文件检查点SCN号了。
(2)控制文件检查点SCN
该序SCN也是判断控制文件是否过“旧”的要素之一,控制文件检查点SCN必须大于或等于所有数据文件头部的检查点SCN号,否则,控制文件同样被认为是“旧”的,实例恢复无法启动
select controlfile_change# from v$database;
--完全检查点把SCN更新至数据文件头和控制文件中
--增量检查点仅把SCN号更新至控制文件中
(3)数据库检查点SCN
控制文件中保存的数据库检查点SCN号实际上在所有数据文件头部中最小的检查点SCN。它是数据文件状态的一个缩影,根据它的值与每个重做日志的高、低位SCN比较,Oracle可以确定恢复文件需要使用的第一个日志文件。
select checkpoint_change# from v$database;--这个值来自于v$datafile_header.checkpoint_change#的最小值
(4)数据文件检查点SCN:当一个检查点动作完成之后,Oracle就把每个数据文件的scn单独存放在控制文件中
select name,checkpoint_change# from v$datafile;
(5)数据文件终止SCN:每个数据文件的终止scn都存储在控制文件中
select name,last_change# from v$datafile;
(6)数据文件启动SCN:Oracle把这个检查点的scn存储在每个数据文件的文件头中
select name,checkpoint_change# from v$datafile_header;
(7)增量检查点信息SCN:每3秒由CKPT进程去更新控制文件中的low cache rba信息,也就是检查点的位置
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;
(8)在线日志文件低位SCN(FIRST_CHANGE#)和高位SCN(NEXT_CHANGE#)
日志文件中的重做记录范围是由这两个SCN来表示的。
select first_change#,next_change# from v$log; --v$log_history
(9)数据块中的SCN
(10)当begin backup命令发出后,相关数据文件的checkpoint scn被冻结(以及状态标志被改变)
3、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不同,需要实例恢复。
4、SCN的增加
(1)只要数据库被修改,SCN就会+1,而不是一定要进行checkpoint,例如DML的发生即使没有提交也会使SCN+1
(2)如果一个DML导致产生事务,则会产生一个SCN
(3)Oracle 10g内部的SCN会默认不管有没有动作,每隔3s自动增加一次
(4)只有ckpt进程才会修改文件头中的checkpoint计数器和SCN,DBWR只会修改数据块,即ckpt通知dbwr写数据文件,写完之后ckpt更新控制文件和数据文件头
5、SCN相关命令及视图
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;