scn详解

 1.scn的定义

SCN(System Change Number),也就是通常所说的系统更改号,是数据库中非常重要的一个数据结构。

SCN用以标志数据库在某个时刻提交的版本。在事务提交时,他被赋予一个唯一的标识事务的SCN。SCN同时也被认为是oracle的内部时钟机制,可被看做是逻辑时钟,,每个数据库都有一个全局的SCN生产器。

SCN 在数据库中是惟一的,并是随时间而增加的,但是可能并不是连续的。除非重建数据库,不然SCN的值永远不会被重置为0.

SCN 在数据库中是无处不在的,常见的事务表、控制文件、数据文件头、日志文件、数据块头等都记录着SCN的值。

冠以不同的前缀,SCN也有不同的名称,如检查点SCN(checkpoint SCN)、resetlogs SCN等。

2.SCN的获取方式

可以使用 dbms_flashback.get_system_change_number获得:

SQL>select dbms_flashback.get_system_change_number from dual;

    1781917309

可以理解,这里返回的SCN,也是目前redo log file最新的SCN记录。因为commit后的交易才会有SCN,而一旦commit就会立刻写入redo log file中。

3.SCN的进一步说明

系统当前SCN并不是在任何数据库操作发生时都会改变,scn通常在事务提交或回滚时改变。在控制文件、数据文件头、日志文件、数据块头都有SCN,但其作用各不同。

(1).数据文件头包含了该数据文件的checkpoint SCN,表示该数据文件最近一次执行检查点操作时的scn。

从控制文件的dump 文件,可以看到如下内容:

DATA FILE #1:
  (name #7) D:\ORACLE\PRODUCT\10.2.0\ORADATA\TSDB\SYSTEM01.DBF
creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1
 tablespace 0, index=1 krfil=1 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:172 scn: 0x0000.6a35da8d 09/07/2011 10:52:40
 Stop scn: 0xffff.ffffffff
09/07/2011 09:47:56
 Creation Checkpointed at scn:  0x0000.00000009 08/30/2005 13:50:22
 thread:0 rba:(0x0.0.0)

.....

sql>alter system checkpoint;

系统已更改。

sql>alter session set events 'immediate trace name file_hdrs level 10';

会话已更改。

在D:\oracle\product\10.2.0\admin\tsdb\udump中找到刚刚转储的文件。

(name #7) D:\ORACLE\PRODUCT\10.2.0\ORADATA\TSDB\SYSTEM01.DBF
creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1
 tablespace 0, index=1 krfil=1 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:173 scn: 0x0000.6a3602ef 09/07/2011 13:46:34
 Stop scn: 0xffff.ffffffff 09/07/2011 09:47:56
 Creation Checkpointed at scn:  0x0000.00000009 08/30/2005 13:50:22
 thread:0 rba:(0x0.0.0)

....

(2)日志文件中包含了Low SCN 和Next SCN.

Low SCN 和Next SCN这两个SCN表示日志文件包含有介于Low SCN 和Nex tSCN的重做信息,对于current的日志文件(当前正在使用的日志文件),其最终SCN不可知,所以Next SCN被置为无穷大,也就是ffffffff。

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
         1          1         23   52428800          1 YES INACTIVE
   1781824259 04-9月 -11

         2          1         25   52428800          1 NO  CURRENT
   1781897818 06-9月 -11

         3          1         24   52428800          1 YES INACTIVE
   1781855546 05-9月 -11


SQL> select dbms_flashback.get_system_change_number from dua

GET_SYSTEM_CHANGE_NUMBER
------------------------
              1781925818

SQL>alter system switch logfile;

系统已更改

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
         1          1         26   52428800          1 NO  CURRENT
   1781925959 07-9月 -11

         2          1         25   52428800          1 YES ACTIVE
   1781897818 06-9月 -11

         3          1         24   52428800          1 YES INACTIVE
   1781855546 05-9月 -11

可以看出scn 1781925818显然位于log group#为2的日志文件中,该日志包含了SCN自1781897818到1781925959的redo信息。oracle需要根据Low SCN 和Nex tSCN来确定需要恢复的信息位于哪一个日志和归档文件中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值