日期:2014-05-16 浏览次数:20570 次
scn号的定义及获取方式
scn即是系统改变号,是oracle内部的逻辑时钟,数据库事务依照scn排序,oracle也根据scn号来实现一致性读的功能,在数据库中scn是唯一的并随着时间而增长。
在控制文件,数据文件头部,日志文件、事务表、数据块头中都记录有scn值,
1、select dbms_flashback.get_system_change_number from dual;9i版本以后
2、select current_scn from v$database;
控制文件及数据文件头scn号更新的几种情况
数据文件头中包含了scn号,该scn号表示该该数据文件最后一次执行检查点操作时的scn,在9i以后oracle引入了增量检查点,脏块的写入方式由原来的一次性大量写入到磁盘,变成了‘实时’小量的写入,同时引入了lrba 、on disk rba、checkpoint queue的概念,在9i以后数据文件头(Checkpointed at scn: 0x0000.000d86da 08/04/2012 09:01:13)和控制文件scn(Database
checkpoint: Thread=1 scn: 0x0000.000d86da)更新有三种情况
1、alter system checkpoint即强制发生完全检查点
2、关闭数据库
3.当日志组中的某个日志由inactive状态变成active状态时会更新控制问价和数据文件头部的scn号,并且该scn号与日志文件的first_change#号相等
数据恢复的过程
当增量检查点发生时并不会更新控制文件和数据文件的scn号,只是会更新控制文件中的lrba 、 on disk rba、on disk scn等信息,如果数据库突然的crash,那么控制文件中的stop scn号为最大值会造成和数据文件头中的scn不一致,oracle即可以判断出oracle为非正常关闭,需要对数据进行恢复,通过控制文件的scn号即可判断从日志组中的哪个日志开始,通过lrba就可以确定从该日志的哪个具体的位置开始跑日志。这样就会将脏块构造出来,对于未提交的数据,利用undo表空间进行回滚。