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