SCN的概念和应用

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

它定义数据库在某个确切时刻提交的版本。在事物提交时,它被赋予一个唯一的标示事物的 SCN 。 SCN 提供 Oracle 的内部时钟机制,
可被看作逻辑时钟,这对于恢复操作是至关重要的 ( Oracle 仅根据 SCN 执行恢复)。

闪回恢复时我们往往需要知道恢复到具体哪个SCN或者哪个时间点。这个成为闪回是否有效的关键一点。


  第一、如何获取SCN

   1、当前SCN以及如何获取

      a、 9I之前 :select max(ktuxescnw * power(2, 32) + ktuxescnb) scn from x$ktuxe;

              x$ktuxe中查询出来的是当前结束事物最大SCN值,并不完全是系统当前SCN

       b、9I之后:select dbms_flashback.get_system_change_number from dual;

             dbms_flashback查询出来的是系统当前的SCN值,可能是当前末结束事务所产生的SCN

       备注:dbms_flashback查询的SCN >= X$KTUXE查询的SCN (这里隐含说明如果没新事务产生且所有事务都结束后两者的SCN是相等的)

 2、数据文件中的CHECKPOINT SCN

          数据文件中的CHECKPOINT SCN的数值来的比两种当前的SCN要小,因为CHECKPOINT SCN是指已经写入磁盘的事务

           查询数据文件上的CHECKPOINT SCN:

           select file#,name,checkpoint_change#,to_char(checkpoint_time,'yyyy-mm-dd hh24:mi :ss') ckp_time from v$datafile;

    第二、SCN与TIME的关系

       数据库闪回到某一点一般有两种方法:

       a、基于时间       b、基于SCN

       对于ORACLE而言基于时间的闪回操作比较不精确,往往可能闪回后发现自己需要的数据或者表没有出现。同时,ORACLE即使是基于时间的闪回其最终系统内部还是要转换成对应SCN来完成闪回操作,所以基于SCN的Flashback Query是最准确的。

       在此我们引出了这里讨论的主题:如何建立SCN和TIME的时间关系

      ORACLE提供了一张系统表SMON_SCN_TIME,该表保存了TIME与SCN对应关系。

       在9IR2当中该表是5分钟刷新一次,保存5天的数据,也就是保存1440条记录(5*24*(60/5)=1440)(这个也就是为何无论你UNDO RETENTION 设置多大,其FLASHBACK QUERY只能是5天的数据范围)。

       因此在9IR2版本中表的属性修改与flashback之间时间差必须至少要达到5分钟,不然要出现ORA--01466: unable to read data - table definition has changed的错误。

       在10G版本中这个时间差缩短到了6秒,即每6秒刷新一次该表。

       该表的形式如下:select * from sys.smon_scn_time; -----9i

      THREAD TIME_MP TIME_DP SCN_WRP SCN_BAS
1 1212371970 2008-6-2 9:59:30 0 1654857
1 1212372375 2008-6-2 10:06:15 0 1674992
1 1212372684 2008-6-2 10:11:25 0 1675907
1 1212372991 2008-6-2 10:16:32 0 1676649


        从上面列表可以发现时间和SCN号对应了起来,同时时间跨度约5分钟。

        通过时间范围来确定对应的SCN就很方便我们做FLASHBACK QUERY或者10G中的闪回。

        比如 select * from t_test as of scn1674992;

      我们能很方便的查询到6月2日10:06:15的数据情况。

    一般在实际中可以根据这个对应表通过时间来查询过去的数据.

    比如

SQL> select SCN,scn_bas,scn_wrp,time_dp from sys.smon_scn_time where time_dp between to_date('2008-09-23 16:00:00','YYYY-MM-DD HH24:MI:SS') and  to_date('2008-09-23 16:47:00','YYYY-MM-DD HH24:MI:SS');

       SCN        SCN_BAS      SCN_WRP TIME_DP
----------     ---------- ----------    -------------------
5.6347E+10  512665365         13 2008-09-23 16:01:33
5.6347E+10  512666070         13 2008-09-23 16:21:36
5.6347E+10  512666195         13 2008-09-23 16:26:06
5.6347E+10  512666491         13 2008-09-23 16:36:06
5.6347E+10  512666815         13 2008-09-23 16:46:06
5.6347E+10  512666695         13 2008-09-23 16:41:45
5.6347E+10  512665503         13 2008-09-23 16:06:01
5.6347E+10  512665825         13 2008-09-23 16:16:01
5.6347E+10  512665668         13 2008-09-23 16:11:18
5.6347E+10  512666371         13 2008-09-23 16:31:30

此时,看SCN 就比较麻烦,这样我们采用时间方式:

SELECT * FROM TEST AS OF timestamp to_date('2008-09-23 16:36:06','YYYY-MM-DD HH24:MI:SS');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值