一、什么是SCN(system change number)?
oracle官方文档给出的定义:A stamp that defines a committed version of a database at a point in time. Oracle assigns every committed transaction a unique SCN.
SCN是一个时间戳,是oracle根据当前内部时钟生成的一串数字,用系统的包可以将SCN与所代表的的时间相互装换,下面会有介绍,何时生成?是每有提交的事务的时候,oracle就会生成一个SCN,在相应产生的归档日志中包括此SCN,在内存中有一份。
二、SCN的作用
SCN是一个时间戳,不可逆的,所以最大的作用就是比对。如果数据库异常关闭(比如突然断电,shutdown abort: 它会立即关闭数据库,等同于断电),oracle在启动时
,会对比控制文件中,datafilestartSCN和datafilecloseSCN,如果datafilecloseSCN为null,则判定需要实例恢复,从redolog中最新的SCN号开始跑日志,恢复databuffer中的数据,直到scn等于datafilestartSCN为止。
三、SCN的存在
系统中用于对比的SCN主要存在于控制文件、数据文件头部、redo中。下面详细说明:
1、控制文件中的SCN,systemSCN
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
383024111
2、控制文件中的针对每个数据文件的开始SCN,这里称为datafilestartSCN
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 383024111
2 383024111
3 383024111
4 383024111
5 383024111
6 383024111
7 383024111
8 383024111
已选择8行。
3、控制文件的针对每个数据文件的结束SCN,这里称为datafilecloeseSCN
SQL> select file#,last_change# from v$datafile;
FILE# LAST_CHANGE#
---------- ------------
1
2
3
4
5
6
7
8
已选择8行。
有一种情况:当把一个tbs设置为readonly时,它的SCN不冻住不会递增,但系统的SCN需要往前递增,这是一个为什么控制文件中存两份SCN的原因之一
4、数据文件头部的SCN,datafileheaderSCN
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 383024111
2 383024111
3 383024111
4 383024111
5 383024111
6 383024111
7 383024111
8 383024111
已选择8行。
5、redolog中的SCN
SQL> select group#,status,first_change# from v$log;
GROUP# STATUS FIRST_CHANGE#
---------- ------------------------------------------------ -------------
1 CURRENT 383024110
2 INACTIVE 383003163
3 INACTIVE 383002048
first_change#表示这种日志开始的SCN号,current的日志的 最新SCN如下:
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
383032550
这也是系统中最新的SCN。