Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7093243
  • 博文数量: 3857
  • 博客积分: 6409
  • 博客等级: 准将
  • 技术积分: 15948
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-02 16:48
个人简介

迷彩 潜伏 隐蔽 伪装

文章分类

全部博文(3857)

文章存档

2017年(5)

2016年(63)

2015年(927)

2014年(677)

2013年(807)

2012年(1241)

2011年(67)

2010年(7)

2009年(36)

2008年(28)

分类: Oracle

2014-06-17 09:17:44

原文地址:SCN的相关解析 作者:guoyJoe

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更新控制文件和数据文件头

*****************************************************************************
相关操作
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:    oracledba_cn@hotmail.com

Blog:      http://blog.csdn.net/guoyJoe

ITPUB:   http://www.itpub.net/space-uid-28460966.html

OCM:    
 _____________________________________________________________

阅读(463) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~