Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44067
  • 博文数量: 20
  • 博客积分: 1419
  • 博客等级: 上尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-23 13:02
文章分类
文章存档

2010年(20)

我的朋友

分类: Oracle

2010-04-14 19:43:36

1. scn: system change number
     用以标识数据库在某个确切时刻提交的版本.
     数据库的内部逻辑时钟.
     每个数据库都有一个全局的SCN生成器.
     它会随着外部变化的加快而加快变化,在数据文件和控制文件里各存放一个SCN号,然后恢复(主要是介质恢复)的时候它们会进行比对,
     一般情况下,这俩个文件里的SCN号是一致的;非正常情况下,要根据实时情况判断这俩个文件里的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;
         
          select to_number('1078F3','xxxxxx') SCN from dual;
         
             
    
 观察scn变化速率
 不繁忙时:
   select current_scn from v$database;
 繁忙时:
  set serveroutput on
  declare
   a number;
  begin
    for i in 1..100 loop
      select current_scn into a from v$database;
      dbms_output.put_line(a);
    end loop;
  end;
  /  **执行上面的PL/SQL语句
  
2. 转储control file和数据文件头信息
  控制文件保存的信息:
    DB名称,创建时间
    所有数据文件和日志文件名称和路径
    表空间信息
    备份信息
    检查点和SCN信息
    归档信息
   
   
 sqlplus sys/oracle as sysdba
 SQL> show parameter user_dump_dest
      /opt/oracle/admin/LH/udump
 quit
 cd /opt/oracle/admin/LH/udump
 rm *.trc
 sqlplus sys/oracle as sysdba
 alter session set events
   'immediate trace name controlf level 8';
 quit
 ll lh_ora_17702.trc 
 vi lh_ora_17702.trc
 观察内容
                     
转储数据文件头信息 
  cd /opt/oracle/admin/LH/udump
 rm *.trc
 sqlplus sys/oracle as sysdba
  alter session set events
    'immediate trace name file_hdrs level 10';
  quit
  vi .trc 
  每个数据文件头信息都会转储出来
  观察内容
转储日志文件
 cd /opt/oracle/admin/LH/udump/
 rm *.trc
 sqlplus sys/oracle as sysdba
 alter system dump logfile '/opt/oracle/oradata/lh/redo01.log';
 quit
 vi  lh_ora_11346.trc
  low scn
  next scn
  标识该日志文件包含这2个值之间的信息
 
 
   CKPT:
     工作:
       (1)向DBWR布置写数据文件
       (2)更新控制文件,数据文件头信息,记录检查点
     触发:
       (1)redolog切换
       (2)alter system checkpoint;
       (3)将tbs->offline,read only,backup
       (4)初始化参数
          log_checkpoint_interval
          log_checkpoint_timeout 
  
    
3.
v$database.checkpoint_change#      记录最后一次检查点发生控制文件的SCN   
    (the scn of ckpt in controlfile)
 select checkpoint_change# from v$database;
v$datafile_header.checkpoint_change#   记录最后一次检查个个数据文件的SCN
    (the scn of every datafile in every datafile)
 select checkpoint_change# from v$datafile_header;
v$datafile.checkpoint_change#    记录最后一次检查个个控制文件的SCN    
    (the scn of every datafile in controlfile)
 select checkpoint_change# from v$datafile;
v$datafile.last_change#     (select last_change# from v$datafile;)          
    每个数据文件的终止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#进行比较 (介质恢复)
                   (比较v$datafile_header和v$database的checkpoint_change#)
  如果这两个值相互匹配,oracle接下来还要比较v$datafile_header.checkpoint_change#和v$datafile.last_change# (实例恢复)
                    (比较v$databasefile_header的checkpoint_change#和v$databasefile的last_change#)
**实例恢复是由SMON,自动恢复
 *1.如果这两个值也一致,就意味着所有数据块都已经提交,所有对数据库的修改都没有
  在关闭数据库的过程中丢失,因此这次启动数据库的过程也不需要任何恢复操作,此时数据库就可以打开了。
 *2.当所有的数据文件都打开之后,存储在控制文件中的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; 
 比较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)介质恢复(DBA要介入)  
  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信息
阅读(1171) | 评论(0) | 转发(0) |
0

上一篇:日志管理

下一篇:linux下常用配置文件

给主人留下些什么吧!~~