ITPub博客

首页 > Linux操作系统 > Linux操作系统 > scn 详解(修改)

scn 详解(修改)

原创 Linux操作系统 作者:JumFlow 时间:2011-06-10 17:26:46 0 删除 编辑

oracle SCN 详解

1. 什么是 scn 

        SCN(system change number) 就是系统改变号 , 是数据库非常重要的一种数据结构。  在数据库中scn 作为一种时钟机制来标记数据库动作,比如当 事物 的发生,数据库会用一个scn来标记它。同时这个SCN在数据库全局也是唯一的,它随时间的增长而增长除非重建数据。

      在数据库中,SCN可以说是无处不在,数据文件头, 控制文件, 数据块头 , 日志文件等等 都标记这 SCN。也正是这样,数据库的一致性维护和SCN密切相关。不管是数据的备份,恢复都是离不开SCN的。 

 

2. 获取当前的SNC

    随着oracle的版本的变化,获取 SNC也有相应的变化,下面是不同版本下 获取 SCN 的方法。

 

   1) 在 Oracle Database 10g  中获取当前SCN比较容易只要查看v$database视图就current_scn列就行。 

    SQL> select * from v$version ;

BANNER
------------------------------------------------------------
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for HPUX: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

SQL> select current_scn from v$database ;

CURRENT_SCN
-----------
  102952636

 

    2) 在 oracle database 9i  中要麻烦些,v$database视图中没有current_scn这列,只有通过查询x$ktuxe视图来得到。 

    SQL> select * from v$version ;

BANNER
--------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE    9.2.0.1.0       Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production

SQL> select max(ktuxescnw*power(2,32)+ktuxescnb) scn from x$ktuxe  ;

       SCN
----------
    316755

(为了方便查询,建议将此查询创建为一个视图,前提是要你应用允许条件下。)

同时在 9i中也提供相应的包来查当前scn 。

SQL> select dbms_flashback.get_system_change_number from dual ;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                  317040

 

3. checkpoint 

要讲清楚scn ,checkpoint 就必不可讲了。 checkpoint 和scn密切相连,checkpoint能对scn做更新操作,当 oracle在做一次checkpoint 动作时,会将数据文件,日志文件,控制文件中的scn进行更新,同时又将db_cache中的胀数据库写入到磁盘中。 可以通过v$instance_recovery中的CKPT_BLOCK_WRITES查询得到因checkpoint 动作写进磁盘的数据块个数。 

SQL> select  CKPT_BLOCK_WRITES from v$instance_recovery ;


CKPT_BLOCK_WRITES

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

             4402

对于checkpoint来说其主要作用有两个,一是减少系统crash恢复的时间,二是保证数据库读一致性。 但这个作用归根到底还是到一点上,就是保证数据定期写到数据库文件中。 在这过程当中,checkpoint 动作就将SCN写入到日志文件,控制文件,数据文件中。这里要说一点的是,在日志文件中包含了Low SCN 和 Next Scn , 这两个scn标示着这个日志文件记录的那个阶段的数据库操作。但对于current 状态的日志文件,其Next SCN被设置为无穷大。 

SQL> select group# , status , first_change# from v$log ;


    GROUP# STATUS           FIRST_CHANGE#

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

         1 ACTIVE                  690093

         2 CURRENT                 698092

         3 INACTIVE                682581

SQL> alter system checkpoint ;

System altered.

Elapsed: 00:00:00.39
SQL> select status , group# from v$log ;

STATUS               GROUP#
---------------- ----------
INACTIVE                  1
CURRENT                   2
INACTIVE                  3

这个就是我数据库日志文件组的信息,在这中间我做了一次手动的checkpoint (alter system checkpoint ) ,是因为我看了日文件组1 的状态为ACTIVE , 



 

 

 

 

 

 

 


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

上一篇: Oracle中的CBO方式
请登录后发表评论 登录
全部评论

注册时间:2011-03-03

  • 博文量
    72
  • 访问量
    185682