日期:2014-05-16 浏览次数:20437 次
SCN是oracle挂在墙上的时钟。早上起床,曰“起床SCN”;吃早餐,名“早餐SCN”;出门上班,称之为“出门SCN”。我们的任何活动,都会对应一个SCN。我们可借助oracle内部的一个包来获取系统的SCN(注意:这里只是系统的scn,因为,oracle还有commit scn,checkpoint scn,select scn等等)。
SQL> select dbms_flashback.get_system_change_number "system's scn" from dual; system's scn ------------ 555956oracle内部只有一个SCN,其他的都是来自它。我们还可以看一下数据库里面最小的SCN。
SQL> select creation_change# "oracle内部最小scn" from v$datafile where file#=1; oracle内部最小scn ----------------- 9我们加在oracle身上的事,无论好坏,oracle都会依据SCN,一一记在心里(日志),莫敢相忘。由于SCN是递增的,我们对应到相关的SCN,就能找到那个时刻,我们对oracle所做的事。这便是SCN的重要性。
SQL> select group#,sequence#,status from v$log; GROUP# SEQUENCE# STATUS ---------- ---------- ---------------- 1 5 CURRENT 2 3 INACTIVE 3 4 INACTIVE接下来,我们对oracle做件事。我们建个表t,有两个字段。其中,字段scn可以约等于事务开始的scn。
SQL> create table t(id int,scn number) tablespace users; Table created. SQL> insert into t values(1,dbms_flashback.get_system_change_number); 1 row created. SQL> commit; Commit complete. SQL> select * from t; ID SCN ---------- ---------- 1 585887我们先把这件事缓缓,来看看v$log里面的first_change#。
SQL> alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss'; Session altered. SQL> select group#,status,first_change#,first_time from v$log; GROUP# STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------------- ------------- ------------------- 1 CURRENT 583374 2012/07/17 19:59:23 2 INACTIVE 560959 2012/07/17 17:13:32 3 INACTIVE 560981 2012/07/17 17:14:33这里的first_change#和first_time是一样的,都是SCN的两种表现形式。first_change#是日志组成为当前日志组时所取的系统的SCN,来作为这一组最小或者开始的SCN。我们所做的事,对应的SCN,都会比first_change#来得大。
SQL> alter system switch logfile; System altered.
SQL> select group#,status,first_change#,first_time from v$log; GROUP# STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------------- ------------- ------------------- 1 ACTIVE 583374 2012/07/17 19:59:23 2 CURRENT 586090 2012/07/18 09:35:40 3 INACTIVE 560981 2012/07/17 17:14:33现在当前日志组变成了第2组,first_change#也发生了变化。
SQL> insert into t values(2,dbms_flashback.get_system_change_number); 1 row created. SQL> commit; Commit complete. SQL> select * from t; ID SCN ---------- ---------- 1 585887 2 586129
SQL> alter system switch logfile; System altered. SQL> select group#,status,first_change#,first_time from v$log; GROUP# STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------------- ------------- ------------------- 1 ACTIVE 583374 2012/07/17 19:59:23 2 ACTIVE 586090 2012/07/18 09:35:40 3 CURRENT 586181 2012/07/18 09:39:21