SCN,系统改变号system change number,是在某个时间点定义数据库已提交版本的时间戳标记。
SCN是一个6字节(48bit)的数字,其值为281,474,976,710,656(2^48),分为2个部分:
SCN_BASE是一个4字节(32bit)的数字
SCN_WRAP是一个2字节(16bit)的数字
每当SCN_BASE达到其最大值(2^32 = 4294967296)时,SCN_WRAP增加1,SCN_BASE将被重置为0,一直持续到SCN_WRAP达到其最大值,即2^16 = 65536。
SCN=(SCN_WRAP * 4294967296)+ SCN_BASE
SCN随着每个事务的完成而增加。提交不会写入数据文件,也不更新控制文件。当发生checkpoint时,控制文件更新,SCN被写入到控制文件。
总共有4种SCN:
系统检查点(System Checkpoint)SCN :
当checkpoint完成后,ORACLE将SystemCheckpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询:
select checkpoint_change# from v$database;
数据文件检查点(Datafile Checkpoint)SCN:
当checkpoint完成后,Oracle将DatafileCheckpoint SCN存放在控制文件中。我们可以通过下面SQL语句查询所有数据文件的Datafile Checkpoinnt SCN。
select name,checkpoint_change# from v$datafile;
结束SCN(Stop SCN):
ORACLE将StopSCN存放在控制文件中。这个SCN号用于检查数据库启动过程是否需要做instance recovery。我们可以通过以下SQL语句查询:
select name,last_change# from v$datafile;
在数据库正常运行的情况下,对可读写的online数据文件,该SCN号为NULL。
开始SCN(Start SCN):
Oracle将StartSCN存放在数据文件头中。这个SCN用于检查数据库启动过程是否需要做media recovery。我们可以通过以下SQL语句查询:
select name,checkpoint_change# from v$datafile_header;
SCN与数据库启动:
Oracle在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery。
media recovery判断:
System Checkpoint SCN、Datafile Checkpoint SCN和Start SCN
instance recovery判断:
Start SCN和Stop SCN
SCN与数据库关闭:
如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN设置为相应数据文件的Start SCN。当数据库启动时,发现它们是一致的,则不需要做instance recovery。在数据库正常启动后,ORACLE会将END SCN设置为NULL.如果数据库异常关闭的话,则END SCN将为NULL。