SCN

scn: system change number
     用以标识数据库在某个确切时刻提交的版本.
     数据库的内部逻辑时钟.
     每个数据库都有一个全局的SCN生成器.
    
     ORACLE通过SCN维护数据库的一致性,
     以及实施至关重要的恢复机制.
    
     SCN的获取
       (1)select dbms_flashback.get_system_change_number from dual; 9i
       (2)select current_scn from v$database; 10g
       (3)select max(ktuxescnw*power(2,32)+ktuxescnb)
            from x$ktuxe; before 9i
       (4)从内存中获取SCN
          sys:
          sql>oradebug setmypid
          sql>oradebug DUMPvar SGA kcsgscn_
  kcslf kcsgscn_ [20009104, 20009124) = 00000000 000704BD 000007D2 00000000 00000000 00000000 00000000 20008F10
          sql>select to_number('704BD','xxxxxx') SCN from dual;
         
             
    
 观察scn变化速率
 不繁忙时:
   select current_scn from v$database;
 繁忙时:
  set serveroutput on  设置标准输出
  declare
   a number;
  begin
    for i in 1..100 loop   [变量i 不用定义 直接使用即可]
      select current_scn into a from v$database;
      dbms_output.put_line(a);
    end loop;
  end;
  /  斜杠表示 开始执行
 
v$database.checkpoint_change#         
    (the scn of ckpt in controlfile)
=
v$datafile_header.checkpoint_change#  
    (the scn of every datafile in every datafile)
=
v$datafile.checkpoint_change#        
    (the scn of every datafile in controlfile)
v$datafile.last_change#               
    每个数据文件的终止scn都存储在controlfile中
    在正常的数据库操作过程中,
    所有正处于联机读写模式下的数据文件的
    终止scn都为null.
  用以标识数据库或数据文件是否正常关闭
 
  [当数据库是read only open模式,v$database.current_scn=0]
在安全关闭数据库的过程中,系统会执行一个检查点动作,
这时所有数据文件的终止scn,都会设置成数据文件头中
的那个checkpoint_change#的值。
在数据库重新启动的时候,需要校验
  (1)数据文件头部的 checkpoint cnt 与
     控制文件中的   checkpoint cnt
     是否一致,如不一致,停止往下进行,
     如一致,继续校验    
  (2)数据文件头的SCN对应控制文件的结束SCN是否一致
 
  Oracle将v$datafile_header.checkpoint_change#
    与v$database.checkpoint_change#进行比较,
    (介质恢复)
  如果这两个值相互匹配,oracle接下来还要比较
    v$datafile_header.checkpoint_change#
    和v$datafile.last_change# (实例恢复)
  如果这两个值也一致,就意味着所有数据块
  都已经提交,所有对数据库的修改都没有
  在关闭数据库的过程中丢失,因此这次
  启动数据库的过程也不需要任何恢复操作,
  此时数据库就可以打开了。
  当所有的数据文件都打开之后,存储在控制文件
  中的v$datafile.last_change#的值再次被
  更改为null,这表示数据文件已经打开
  并能够正常使用了。
在数据文件打开过程中, 
  如果v$datafile_header.checkpoint_change#
  与v$database.checkpoint_change#不同,需要介质恢复
 如果v$datafile_header.checkpoint_change#
 和v$datafile.last_change#不同,需要实例恢复
open:
 select checkpoint_change# from v$database            622419
 select checkpoint_change# from v$datafile            622419
 select last_change# from v$datafile                   null
 select checkpoint_change# from v$datafile_header     622419
(1)正常关闭
   ORACLE_SID=LH
   sqlplus sys/oracle as sysdba
   shutdown immediate              把所有数据文件的终止scn(null),都会设置成数据文件头中的那个checkpoint_change#的值
  startup mount
     select checkpoint_change# from v$database            623414  
 select checkpoint_change# from v$datafile           623414  
 select last_change# from v$datafile                   623414
 select checkpoint_change# from v$datafile_header     623414
 alter database open;  由Mount阶段到open阶段SCN值会自动加1
 比较v$datafile_header.checkpoint_change#与v$database.checkpoint_change#
 比较v$datafile_header.checkpoint_change#和v$datafile.last_change#
     select checkpoint_change# from v$database            623415  
 select checkpoint_change# from v$datafile            623415  
 select last_change# from v$datafile                   null
 select checkpoint_change# from v$datafile_header     623415
(2)非正常关闭
   在ORACLE打开状态下,断电,直接关机
  启动OS
   ORACLE_SID=LH
    sqlplus sys/oracle as sysdba 
 startup mount
     select checkpoint_change# from v$database            623415  
 select checkpoint_change# from v$datafile            623415  
 select last_change# from v$datafile                   null
 select checkpoint_change# from v$datafile_header     623415
 alter database open; 
 比较v$datafile_header.checkpoint_change#与v$database.checkpoint_change#
 比较v$datafile_header.checkpoint_change#和v$datafile.last_change#不同,需要实例恢复
 tail -f -n 300 alert_LH.log
 SMON: enabling cache recovery
 SMON: enabling tx recovery
     select checkpoint_change# from v$database            645765  
 select checkpoint_change# from v$datafile            645765  
 select last_change# from v$datafile                   null
 select checkpoint_change# from v$datafile_header     645765
(3)介质恢复  
  open:
   ORACLE_SID=LH
    sqlplus sys/oracle as sysdba
 alter database begin backup;
    $ cp tbs16.dbf tbs16.dbf.bak
 sqlplus sys/oracle as sysdba
     select checkpoint_change# from v$database            517792  
 select checkpoint_change# from v$datafile            517962  
 select last_change# from v$datafile                   null
 select checkpoint_change# from v$datafile_header     517962
     alter database end backup;
     select checkpoint_change# from v$database            517792  
 select checkpoint_change# from v$datafile            517962  
 select last_change# from v$datafile                   null
 select checkpoint_change# from v$datafile_header     517962
shutdown immediate
    $ mv  tbs16.dbf.bak  tbs16.dbf
 startup mount
     select checkpoint_change# from v$database            518771  
 select checkpoint_change# from v$datafile            518771  
 select file#,last_change# from v$datafile            518771
 select file#,checkpoint_change# from v$datafile_header  518771   (7)  517962  
 alter database open; 
 比较v$datafile_header.checkpoint_change#与v$database.checkpoint_change#不同,需要介质恢复                       
    ORA-01113: file 7 needs media recovery
    recover database;
  Media recovery complete.
  select checkpoint_change# from v$database           518771  
  select checkpoint_change# from v$datafile           518771  
  select file#,last_change# from v$datafile           518771 (7) 518770
  select file#,checkpoint_change# from v$datafile_header 518771   (7)  518770  
    alter database open;  
  比较v$datafile_header.checkpoint_change#和v$datafile.last_change# 不同,需要实例恢复
       SMON: enabling cache recovery
 SMON: enabling tx recovery
      select checkpoint_change# from v$database           518772  
  select checkpoint_change# from v$datafile           518772  
  select file#,last_change# from v$datafile           null
  select file#,checkpoint_change# from v$datafile_header 518772
  
 
 
 
sqlplus sys/oracle as sysdba
SQL> oradebug setmypid
sql> oradebug dump controlf 4
$ORACLE_BASE/admin/hj/udump/hj_ora_4198.trc
我们可以看到所有的数据文件Stop scn: 0xffff.ffffffff,这是一个极大的值,说明我们的数据库是打开的。我们知道,shutdown abort的时候,
没有checkpoint,控制文件也不会被更新,当数据库重新启动的时候,Oracle会发现这个SCN仍然是这个极大值,和数据库的Checkpoint SCN不一样,
此时数据库就会进行恢复,只有当这两个SCN一样,数据库才能OPEN。

redo: 已提交,datafile想要,但没有,需要应用redologfile里的redo sql
undo: 未提交,datafile不想要,但有了,需要应用undofile里的undo信息

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20670907/viewspace-742560/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20670907/viewspace-742560/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值