OracleSCN相关问题学习与测试目录1、SCN的介绍2、SCN的工作机制3、SCN的增加4、其他的SCN5测试6小结7问题1、SCN的介绍Oracle中的SCN有下面几种:1)系统检查点scn(v$database(checkpoint_change#))当一个检查点动作完成之后,Oracle就把系统检查点的SCN存储到控制文件中selectcheckpoint_change#fromv$database;2)数据文件检查点scn(v$datafile(checkpoint_change#))当一个检查点动作完成之后,Oracle就把每个数据文件的scn单独存放在控制文件中selectname,checkpoint_change#fromv$datafile;3)数据文件终止scn(v$datafile(last_change#))每个数据文件的终止scn都存储在控制文件中。在正常的数据库操作过程中,所有正处于联机读写模式下的数据文件的终止scn都为null,异常关闭后的StopSCN,也为NULL.selectname,last_change#fromv$datafile;4)数据文件启动scn(v$datafile_header(checkpoint_change#)Oracle把这个检查点的scn存储在每个数据文件的文件头中,这个值称为启动scn,因为它用于在数据库实例启动时,检查是否需要执行数据库恢复selectname,checkpoint_change#fromv$datafile_header;2、SCN的工作机制1)在数据库打开并运行之后,控制文件中的系统检查点scn、控制文件中的数据文件检查点scn和每个数据文件头中的启动scn都是相同的2)控制文件中的每个数据文件的终止scn都为null3)NORMAL或IMMEDIATE关闭数据库的过程中,系统会执行一个检查点动作,这时所有数据文件的终止scn都会设置成数据文件头中的那个启动scn的值。4)在数据库重新启动的时,Oracle将执行两次检查◆看数据文件头中的ckpt计数器(v$datafile_header.checkpoint_count)是否与对应控制文件中的ckpt计数器(v$datafile.)一致。若相等,进行第二次检查◆比较文件头中的启动scn和对应控制文件中的终止scn进行比较,如果终止scn等于启动scn,则不需要对那个文件进行恢复5)数据库打开之后,存储在控制文件中的数据文件终止scn的值再次被更改为null,这表示数据文件已经打开并能够正常使用了注:当ABORT强制关闭数据库时不进行检查点处理,所以终止scn仍然为无穷大。在下次启动期间,发现启动scn和终止scn不同,需要进行线程恢复。3、SCN的增加1)SCN(SystemChangeNumber)只要数据库被修改,就会+1,而不是一定要进行checkpoint,例如DML的发生即使没有提交也会使SCN+1.(哪些情况下SCN会发生变化?)注:SCN增加并不代表会在数据文件头中表现出来,而是需要等到checkpoint执行后才写入(当然可能已经增加了很多)2)如果一个DML导致产生事务,则会产生一个SCN。这个意思是说如果一个事务包含多个dml,则只有第一个初始产生事务的dml产生scn,提交的时候又是一个scn,如果一个事务只有一个dml,那看起来就是dml产生一个scn,提交或者回滚产生一个scn。3)Oracle10g内部的SCN会默认不管有没有动作,每隔3s自动增加一次。其他需要增加的情况则再加。4)只有ckpt进程才会修改文件头中的checkpoint计数器和SCN,DBWR只会修改数据块,即ckpt通知dbwr写数据文件,写完之后ckpt更新控制文件和数据文件头。此时若DBWR发现数据块的logblock还没有被写入日志文件,则在dbwr写块之前通知lgwr把logbuffer中的日志写入log文件。注:总结一下,日志切换必定触发ckpt,但ckpt不一定会触发lgwr,但是一定会触发dbwr4、其他的SCN1)日志文件头中包含了Lowscn、Nextscn,表示所给日志文件包含有从Lowscn到Nextscn的redorecord.(如何查看?REDOSCN)注:当系统运行时,日志文件的Nextscn同样为无穷大。而且需要注意:在恢复时定位到底使用哪个日志文件的时候,并不是用数据文件中的lowscn去框,也不是只要在日志文件的lowscnandnextscn之间就利用该日志文件。而是在数据文件头中有RBA的记录,RBA包含了日志序号Sequence#、blocknumber、slotnumber。这样可以直接定位到日志文件(归档日志文件)和具体的位置。在确定了哪个数据文件必须redo后,oracle会比较changevector(向量)中的SCN和数据文件数据块中的SCN,如果changevector的SCN小于数据块的scn,则跳过此changevector,否则应用redo.2)数据块中的SCNdatablock里面的SCN是当block被更改的时候的SCN,而数据文件有那么多block,自然不同的block有不同的SCN,block中存在blockSCN和ITL中的commitSCN。blockSCN又在块头和块位都有,若不一致意味着block损坏。而ITL中的commitSCN则跟consistentgetsanddelayblockcleanout有关。(BlockSCN如何查看?)3)v$database中的checkpoint_change#和dbms_flashback.get_system_change_number不同。前者是作为数据库的最后一次checkpoint是的SCN,而后者是系统的最新SCN,所以一般后者都会比前者大,而当刚做完checkpoint时候两者会差不多。(Checkpoint的触发机制?)4)当beginbackup命令发出后,相关数据文件的checkpointscn被冻结(以及状态标志被改变),其他一切照旧。例如:日志切换时checkpointcount正常递增/检查点照常写文件,自然文件中的数据块内的各种scn也照常递增。5测试:A.正常关闭,mount数据库SQLcolsystem_scnformat999999999999999999SQLcoldatafile_scnformat999999999999999999SQLcolstart_scnformat999999999999999999SQLcolstop_scnformat999999999999999999SQLselecta.checkpoint_change#system_scn,c.checkpoint_change#start_scn,scn,rerownum=1)c,b.checkpoint_change#datafile_scn,decode(b.last_change#,NULL,'null',b.last_change#)stop_scnp_scnfromv$databasea,(selectcheckpoint_change#,last_change#fromv$datafilewhererownum=1)b,(selectcheckpoint_change#fromv$datafile_headerwhererownum=1)c;SYSTEM_SCNSTART_SCNDATAFILE_SCNSTOP_SCN-------------------------------------------------------------------------------------------------2696048203982269604820398226960482039822696048203982上述查询结果表明:结束SCN都是跟启动SCN是一样的,这样,当数据库open的时候就可以不用recover了。把数据库打开openSQLalterdatabaseopen;Databasealtered.SQLselecta.checkpoint_change#system_scn,c.checkpoint_change#start_scn,2b.checkpoint_change#datafile_scn,decode(b.last_change#,NULL,'null',b.last_change#)stop_scn3fromv$databasea,4(selectcheckpoint_change#,last_change#fromv$datafilewhererownum=1)b,5(selectcheckpoint_change#fromv$datafile_headerwhererownum=1)c;SYSTEM_SCNSTART_SCNDATAFILE_SCNSTOP_SCN-------------------------------------------------------------------------------------------------269604820398326960482039832696048203983null系统检查点scn增加了1。控制文件中的数据文件检查点scn和数据文件的文件头中的启动scn也都各自增加了1。控制文件中的数据文件终止scn,变为NULL.C.对系统触发检查点SQLaltersystemcheckpoint;Systemaltered.SQLselecta.checkpoint_change#system_scn,c.checkpoint_change#start_scn,2b.checkpoint_change#datafile_scn,decode(b.last_change#,NULL,'null',b.last_change#)stop_scn3fromv$databasea,4(selectcheckpoint_change#,last_change#fromv$datafilewhererownum=1)b,5(selectcheckpoint_change#fromv$datafile_headerwhererownum=1)c;SYSTEM_SCNSTART_SCNDATAFILE_SCNSTOP_SCN-------------------------------------------------------------------------------------------------269604820421226960482042122696048204212null系统检查点scn发生变化,增加不止1,这与检查点产生机制有关。D异常关闭启动!没有将StartSCN同步给StopSCN,造成不一致.需要InstanceRecoverySQLshutdownabortSQLstartupmountDatabasemounted.SQLselecta.checkpoint_change#system_scn,c.checkpoint_change#start_scn,2b.checkpoint_change#datafile_scn,decode(b.last_change#,NULL,'null',b.last_change#)stop_scn3fromv$databasea,4(selectcheckpoint_change#,last_change#fromv$datafilewhererownum=1)b,5(selectcheckpoint_change#fromv$datafile_headerwhererownum=1)c;SYSTEM_SCNSTART_SCNDATAFILE_SCNSTO