ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle SCN相关问题学习与测试

Oracle SCN相关问题学习与测试

原创 Linux操作系统 作者:gdutllf2006 时间:2010-03-06 11:12:59 0 删除 编辑

Oracle SCN相关问题学习与测试

 

目录

1、SCN的介绍

2、SCN的工作机制

3、SCN的增加

4、其他的SCN

5 测试

6 小结

7 问题

 

1、SCN的介绍


Oracle
中的SCN有下面几种:

1) 系统检查点scn(v$database(checkpoint_change#))

当一个检查点动作完成之后,Oracle就把系统检查点的SCN存储到控制文件中

   select checkpoint_change# from v$database;

 

2) 数据文件检查点scn (v$datafile(checkpoint_change#))

    当一个检查点动作完成之后,Oracle就把每个数据文件的scn单独存放在控制文件中

        select name,checkpoint_change# from v$datafile;

   

3) 数据文件终止scn (v$datafile(last_change#))

    每个数据文件的终止scn都存储在控制文件中。在正常的数据库操作过程中,所有正处于联机读写模式下的数据文件的终止scn都为null, 异常关闭后的Stop SCN, 也为 NULL.

     select name,last_change# from v$datafile;

 

4) 数据文件启动scn (v$datafile_header(checkpoint_change#)

    Oracle把这个检查点的scn存储在每个数据文件的文件头中,这个值称为启动scn,因为它用于在数据库实例启动时,检查是否需要执行数据库恢复

     select name,checkpoint_change# from v$datafile_header;

 

 

2、SCN的工作机制

 

1) 在数据库打开并运行之后,控制文件中的系统检查点scn、控制文件中的数据文件检查点scn和每个数据文件头中的启动scn都是相同的

 

 2 ) 控制文件中的每个数据文件的终止scn都为null

 

 3) 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(System Change Number)只要数据库被修改,就会+1,而不是一定要进行checkpoint,例如DML的发生即使没有提交也会使SCN+1.(哪些情况下SCN会发生变化? )

 

   注:SCN增加并不代表会在数据文件头中表现出来,而是需要等到checkpoint执行后才写入(当然可能已经增加了很多)

 

 2) 如果一个DML导致产生事务,则会产生一个SCN。这个意思是说如果一个事务包含多个dml,则只有第一个初始产生事务的dml产生scn,提交的时候又是一个scn,如果一个事务只有一个dml,那看起来就是dml产生一个scn,提交或者回滚产生一个scn。

 

3) Oracle 10g内部的SCN会默认不管有没有动作,每隔3s自动增加一次。其他需要增加的情况则再加。

 

 4) 只有ckpt进程才会修改文件头中的checkpoint计数器和SCN,DBWR只会修改数据块,即ckpt通知dbwr写数据文件,写完之后ckpt更新控制文件和数据文件头。此时若DBWR发现数据块的log block还没有被写入日志文件,则在dbwr写块之前通知lgwr把log buffer中的日志写入log文件。

 

   注:总结一下,日志切换必定触发ckpt,但ckpt不一定会触发lgwr,但是一定会触发dbwr

 

4、其他的SCN

 

1) 日志文件头中包含了Low scn、Next scn,表示所给日志文件包含有从Low scn到Next scn的redo record. (如何查看? REDO SCN)

 

   注:当系统运行时,日志文件的Next scn同样为无穷大。而且需要注意:在恢复时定位到底使用哪个日志文件的时候,并不是用数据文件中的 low scn 去框,也不是只要在日志文件的low scn and next scn 之间就利用该日志文件。而是在数据文件头中有 RBA 的记录,RBA 包含了日志序号Sequence#、block number 、slot number 。 这样可以直接定位到日志文件(归档日志文件)和具体的位置。

在确定了哪个数据文件必须redo后,oracle会比较change vector(向量)中的SCN和数据文件数据块中的SCN,如果change vector的SCN小于数据块的scn,则跳过此change vector,否则应用redo.

 

2) 数据块中的SCN

data block里面的SCN是当block被更改的时候的SCN,而数据文件有那么多block,自然不同的block有不同的SCN,block中存在block SCN和ITL中的commit SCN。block SCN又在块头和块位都有,若不一致意味着block损坏。而ITL中的commit SCN则跟consistent gets and delay block cleanout有关。(Block SCN 如何查看?)

 

3) v$database中的checkpoint_change#和dbms_flashback.get_system_change_number不同。前者是作为数据库的最后一次checkpoint是的SCN,而后者是系统的最新SCN,所以一般后者都会比前者大,而当刚做完checkpoint时候两者会差不多。(Checkpoint的触发机制?)

 

 

 4) 当begin backup命令发出后,相关数据文件的checkpoint scn被冻结(以及状态标志被改变),其他一切照旧。例如:日志切换时checkpoint count正常递增/检查点照常写文件,自然文件中的数据块内的各种scn也照常递增。

 

5 测试:

 

A. 正常关闭, mount 数据库

 

SQL> col system_scn format 999999999999999999

SQL> col datafile_scn format 999999999999999999

SQL> col start_scn format 999999999999999999

SQL> col stop_scn format 999999999999999999

SQL> select a.checkpoint_change# system_scn, c.checkpoint_change# start_scn, scn, re rownum=1) c;

               b.checkpoint_change# datafile_scn, decode(b.last_change#,NULL,'null',b.last_change#) stop_scnp_scn

               from v$database a,

               (select checkpoint_change#,  last_change# from v$datafile where rownum =1 ) b, 

              (select checkpoint_change# from v$datafile_header where rownum=1) c;

 

SYSTEM_SCN           START_SCN        DATAFILE_SCN   STOP_SCN

------------------- ------------------- ------------------- ----------------------------------------

      2696048203982       2696048203982       2696048203982 2696048203982

 

上述查询结果表明:

结束SCN都是跟启动SCN是一样的,这样,当数据库open的时候就可以不用recover了。

 

 

把数据库打开open

 

SQL> alter database open;

  Database altered.

 

 

 

SQL> select a.checkpoint_change# system_scn, c.checkpoint_change# start_scn,

  2  b.checkpoint_change# datafile_scn, decode(b.last_change#,NULL,'null',b.last_change#) stop_scn

  3  from v$database a,

  4  (select checkpoint_change#,  last_change# from v$datafile where rownum =1 ) b,

  5  (select checkpoint_change# from v$datafile_header where rownum=1) c;

 

         SYSTEM_SCN           START_SCN        DATAFILE_SCN STOP_SCN

------------------- ------------------- ------------------- ----------------------------------------

      2696048203983       2696048203983       2696048203983 null

 

系统检查点scn增加了1。

控制文件中的数据文件检查点scn和数据文件的文件头中的启动scn也都各自增加了1。

 

控制文件中的数据文件终止scn,变为NULL.

 

C.对系统触发检查点

 

SQL> alter system checkpoint;

  System altered.

 

SQL> select a.checkpoint_change# system_scn, c.checkpoint_change# start_scn,

  2  b.checkpoint_change# datafile_scn, decode(b.last_change#,NULL,'null',b.last_change#) stop_scn

  3  from v$database a,

  4  (select checkpoint_change#,  last_change# from v$datafile where rownum =1 ) b,

  5  (select checkpoint_change# from v$datafile_header where rownum=1) c;

 

         SYSTEM_SCN           START_SCN        DATAFILE_SCN STOP_SCN

------------------- ------------------- ------------------- ----------------------------------------

      2696048204212       2696048204212       2696048204212 null

 

系统检查点scn 发生变化,增加不止1, 这与检查点产生机制有关。

 

 

D 异常关闭启动!没有将Start SCN同步给Stop SCN,造成不一致.需要Instance Recovery

 

SQL> shutdown abort

SQL> startup mount

Database mounted.

 

SQL> select a.checkpoint_change# system_scn, c.checkpoint_change# start_scn,

  2  b.checkpoint_change# datafile_scn, decode(b.last_change#,NULL,'null',b.last_change#) stop_scn

  3  from v$database a,

  4  (select checkpoint_change#,  last_change# from v$datafile where rownum =1 ) b,

  5  (select checkpoint_change# from v$datafile_header where rownum=1) c;

 

         SYSTEM_SCN           START_SCN        DATAFILE_SCN STOP_SCN

------------------- ------------------- ------------------- ----------------------------------------

      2696048204212       2696048204212       2696048204212 null

 

按理说在数据文件启动之前 End SCN的值不应为NULL,但这里查出却为NULL ,之前的理解是有误的, 在Shutdown Abort后, Stop SCN仍为NULL. (异常关闭后的Start Mount,在打开之前要做Instance Recovery)

 

SQL> alter database open;

Database altered.

 

Vi alert.log

 

alter database open

Mon Feb  1 14:27:05 2010

Beginning crash recovery of 1 threads

Mon Feb  1 14:27:05 2010

Started first pass scan

Mon Feb  1 14:27:05 2010

Completed first pass scan

 61 redo blocks read, 30 data blocks need recovery

Mon Feb  1 14:27:05 2010

Started recovery at

 Thread 1: logseq 71, block 7466, scn 0.0

Recovery of Online Redo Log: Thread 1 Group 1 Seq 71 Reading mem 0

  Mem# 0 errs 0: /opt/oracle/oradata/mydb/redo01.log

Mon Feb  1 14:27:05 2010

Completed redo application

Mon Feb  1 14:27:05 2010

Ended recovery at

 Thread 1: logseq 71, block 7527, scn 627.3103729640

 30 data blocks read, 30 data blocks written, 61 redo blocks read

Crash recovery completed successfully

 

完成在线日志应用

 

SQL> select a.checkpoint_change# system_scn, c.checkpoint_change# start_scn, scn,

b.checkpoint_change# datafile_scn, decode(b.last_change#,NULL,'null',b.last_change#) stop_scnp_scn

  3  from v$database a,

  4  (select checkpoint_change#,  last_change# from v$datafile where rownum =1 ) b,

  5  (select checkpoint_change# from v$datafile_header where rownum=1) c;

 

         SYSTEM_SCN           START_SCN        DATAFILE_SCN STOP_SCN

------------------- ------------------- ------------------- ----------------------------------------

      2696048224234       2696048224234       2696048224234 null

 

 

6 小结

 

1、系统正常关闭:

  1)system checkpoint scn = datafile checkpoint scn = start scn,不需要介质恢复

  2)stop scn is not null = start SCN,不需要实例恢复

 

2、系统异常关闭:

  1)system checkpoint scn = datafile checkpoint scn = start scn,不需要介质恢复

  2)stop scn is null,需要实例恢复

 

3、旧数据文件

  会使得:system checkpoint scn = datafile checkpoint scn > start scn,stop scn is null/ is not null

  1)system checkpoint scn = datafile checkpoint scn > start scn

需要介质恢复成system checkpoint scn = datafile checkpoint scn = start scn

 

2)stop scn is null,需要实例恢复,is not null 不需要实例恢复

 

4、备份控制文件

  会使得:system checkpoint scn = datafile checkpoint scn <= start scn(当数据文件为旧且和旧控制文件为同一版本的时候相等,如果数据文件是当前的数据文件则是小于),stop scn notnull/null

  1)system checkpoint scn = datafile checkpoint scn <= start scn,需要使用using backup controlfile介质恢复成system scn = datafile scn = start scn = current log scn(当前日志最大SCN)

  

2)为保证上一次恢复没有用到log日志不被使用,必须在恢复完成后用resetlogs打开数据库

 

 

5、以noresetlogs方式重建控制文件

  在以这种方式重建控制文件时,控制文件中的datafile checkpoint scn来自于Online logs中的Current log头,因此

  current log scn = system checkpoint scn = datafile scn >= start scn(如果数据文件为备份而来则会大于start SCN,如果是当前的则为相等于start SCN), stop scn not null/null

  1)current log scn = system checkpoint scn = datafile checkpoint scn >= start scn,因此需要介质恢复成system checkpoint scn = datafile scn = start scn = redolog scn(当前日志最大SCN)

  

2)stopscn is not null 不需要实例恢复

 

6、以resetlogs方式重建控制文件

  控制文件中datafile checkpoint scn 来自各数据文件头(start scn),而且system checkpoint scn会归为0

  system checkpoint scn < datafile checkpoint scn = start scn,stop scn not null/null

 

1)system checkpoint scn < datafile checkpoint scn = start scn,需要使用using backup controlfile介质恢复成system checkpoint scn = datafile checkpoint scn = start scn(当前日志最大SCN),stop scn not null

  

2)      stopscn is not null 不需要实例恢复,而且因为SCN已经为redolog scn,log已经不能使用,必须用resetlogs方式打开数据库

 

7 问题:

7.1 数据库启动过程的两个比较.

 v$datafile_header.checkpoint_count  VS  对应控制文件中的ckpt计数器(v$datafile.) 在哪个视图 ?

 

7.2  哪些情况下SCN会发生变化? 这几个SCN如何变化?

 

7.3       如何查看 REDO SCN?

 

7.4       Block SCN 如何查看?

 

7.5  Checkpoint的触发机制?

下面这些操作将会触发checkpoint事件:

1)        日志切换,通过ALTER SYSTEM SWITCH LOGFILE。(之前的资料说这里,发出的应是增量检查点 ?是的,日志切换只能产生增量检查点)

2)        DBA发出checkpoint命令,通过ALTER SYSTEM checkpoint。

3)        对数据文件进行热备时,针对该数据文件的checkpoint也会进行,ALTER TABLESPACE TS_NAME BEGIN BACKUP/END BACKUP。

4)        当运行ALTER TABLESPACE/DATAFILE READ ONLY的时候。

5)        SHUTDOWN命令发出时。

 

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

请登录后发表评论 登录
全部评论

注册时间:2009-07-08

  • 博文量
    133
  • 访问量
    425851