Oracle SCN说明

来源:互联网 发布:羊毛 起球 知乎 编辑:程序博客网 时间:2024/05/21 14:01

Oracle SCNSystem Chang Number作为oracle中的一个重要机制,在数据恢复、Data Guard、RAC节点间、goldengate复制、stream复制的同步等各个功能中起着重要作用。理解SCN的运作机制,可以帮助你更加深入地了解上述功能。

首先,我们先看一下Oracle怎样写入数据文件,总所周知oracle是先记后写,顺序为:

1、 事务开始;

2、 在database_buffer_cache中找到需要的数据块,如果没有找到,则从磁盘中的数据文件中载入buffer cache中;

3、 事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;

4、 事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;

5、 当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将DBuffer Cache中的脏数据写入到数据文件中。

通过这5步,oracle把脏数据写入磁盘中。

那么什么是SCN呢?这5步和SCN又有什么关系呢?

Oracle SCN是一个数字,确切的说是一个只会增加、不会减少的数字。正是它这种只会增加的特性确保了Oracle知道哪些应该被恢复、哪些应该被删除,经常用在instance级别的恢复。

Oracle中有4中SCN:系统检查点(System Checkpoint)SCN、数据文件检查点(Datafile Checkpoint)SCN、结束SCN(Stop SCN)、开始SCN(Start SCN)。其中3中SCN存在于控制文件中,最后一种则存在于数据文件的文件头中。在控制文件中,System Checkpoint SCN是针对整个数据库全局的,因而之存在一个,而Datafile Checkpoint SCN和Stop SCN是针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份Datafile Checkpoint SCN和Stop SCN。在数据库正常运行期间,Stop SCN(通过视图v$datafile的字段last_change#可以查询)是一个无穷大的数字或者说是NULL。

SQL> select file#, creation_change#, checkpoint_change#, last_change#, offline_change#, online_change# from v$datafile;

     FILE# CREATION_CHANGE# CHECKPOINT_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# ONLINE_CHANGE#
---------- ---------------- ------------------ ------------ --------------- --------------
         1                7            1784744                       754487         754488
         2             2164            1784744                       754487         754488
         3           752002            1784744                       754487         754488
         4            18243            1784744                       754487         754488

 

SQL> alter tablespace users offline;

Tablespace altered.

SQL> select file#, creation_change#, checkpoint_change#, last_change#, offline_change#, online_change# from v$datafile;

     FILE# CREATION_CHANGE# CHECKPOINT_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# ONLINE_CHANGE#
---------- ---------------- ------------------ ------------ --------------- --------------
         1                7            1784744                       754487         754488
         2             2164            1784744                       754487         754488
         3           752002            1784744                       754487         754488
         4            18243            1787682      1787682          754487         754488

 

 

在一个事务提交后(上述第四个步骤),会在redo log中存在一条redo记录,同时,系统为其提供一个最新的SCN(通过函数dbms_flashback.get_system_change_number可以知道当前的最新SCN),记录在该条记录中。如果该条记录是在redo log被清空(日志满做切换时或发生checkpoint时,所有变化日志已经被写入数据文件中),则其SCN被记录为redo log的low SCN。以后在日志再次被清空前写入的redo记录中SCN则成为Next SCN。

当日志切换或发生checkpoint(上述第五个步骤)时,从Low SCN到Next SCN之间的所有redo记录的数据就被DBWn进程写入数据文件中,而CKPT进程则将所有数据文件(无论redo log中的数据是否影响到该数据文件)的文件头上记录的Start SCN(通过视图v$datafile_header的字段checkpoint_change#可以查询)更新为Next SCN,同时将控制文件中的System Checkpoint SCN(通过视图v$database的字段checkpoint_change#可以查询)、每个数据文件对应的Datafile Checkpoint(通过视图v$datafile的字段checkpoint_change#可以查询)也更新为Next SCN。但是,如果该数据文件所在的表空间被设置为read-only时,数据文件的Start SCN和控制文件中Datafile Checkpoint SCN都不会被更新。

 

 

 

 

原创粉丝点击