暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SCN

Oracle那些事 2021-02-06
611

SCN介绍

系统改变号system change number,是在某个时间点定义数据库已提交版本的时间戳标记。Oracle为每个已提交的事务分配一个唯一SCNSCN的值是对数据库进行更改的逻辑时间点。数据文件头,控制文件,数据块头,日志文件等等都标记着SCN。也正是这样,数据库的一致性维护和SCN密切相关。不管是数据的备份,恢复都是离不开SCN的。

 

SCN是一个6字节(48bit)的数字,其值为281,474,976,710,6562^48),分为2个部分:

SCN_BASE是一个4字节(32bit)的数字

SCN_WRAP是一个2字节(16bit)的数字

每当SCN_BASE达到其最大值(2^32 = 4294967296)时,SCN_WRAP增加1SCN_BASE将被重置为0,一直持续到SCN_WRAP达到其最大值,即2^16 = 65536

SCN=SCN_WRAP * 4294967296+ SCN_BASE

SCN随着每个事务的完成而增加。提交不会写入数据文件,也不更新控制文件。当发生checkpoint时,控制文件更新,SCN被写入到控制文件。

 

当前的SCN可以通过以下查询获得:

    select dbms_flashback.get_system_change_number scn from dual;
    select current_scn fromv$database;


    首先了解一下oracle事务中的数据变化是如何写入数据文件的:

    第一步:事务开始;

    第二步:在buffer cache中找到需要的数据块,如果没找到,从数据文件中载入buffer cache中;

    第三步:事务修改buffer cache的数据块,该数据被标识为脏数据,并被写入log buffer中;

    第四步:事务提交,LGWR进程将log buffer中的脏数据的日志条目写入redo log file中;

    第五步:当发生checkpointCKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。

     

    经过上述5个步骤,事务中的数据变化最终被写到数据文件中。

     

     

    总共有4SCN: 

    系统检查点(System CheckpointSCN

       checkpoint完成后,ORACLESystemCheckpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询:

      select checkpoint_change# from v$database;


       

      数据文件检查点(Datafile CheckpointSCN

         checkpoint完成后,OracleDatafileCheckpoint SCN存放在控制文件中。我们可以通过下面SQL语句查询所有数据文件的Datafile Checkpoinnt SCN

        select name,checkpoint_change# fromv$datafile;


         

        结束SCNStop SCN):

           ORACLEStopSCN存放在控制文件中。这个SCN号用于检查数据库启动过程是否需要做instance recovery。我们可以通过以下SQL语句查询:

          select name,last_change# from v$datafile;


          在数据库正常运行的情况下,对可读写的online数据文件,该SCN号为NULL

           

          开始SCNStart SCN):

             OracleStartSCN存放在数据文件头中。这个SCN用于检查数据库启动过程是否需要做media recovery。我们可以通过以下SQL语句查询:

            select name,checkpoint_change# fromv$datafile_header;


             

            SCN与数据库启动:

            在数据库启动过程中,当System Checkpoint SCNDatafile Checkpoint SCNStart SCN都相同时,数据库可以正常启动,不需要做media recovery。三者当中有一个不同时,则需要做media recovery.如果在启动的过程中,End SCNNULL,则需要做instance recoveryOracle在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery

            SCN与数据库关闭:

            如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN设置为相应数据文件的Start SCN。当数据库启动时,发现它们是一致的,则不需要做instance recovery。在数据库正常启动后,ORACLE会将END SCN设置为NULL.如果数据库异常关闭的话,则END SCN将为NULL

             


            文章转载自Oracle那些事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论