日期:2014-05-16 浏览次数:20531 次
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
------------
555956 oracle内部只有一个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