SCN

一、SCN的引入

众所周知,当oracle实例崩溃时,oracle通过检查点队列使用CKPT进程,周期性的将LRBA记入控制文件,以记录读取REDO LOG的范围。确定范围之后,oracle首先进行前滚(将redo log中的数据块重新构造成buffer),然后回滚(将不需要进行构造的未提交的脏块回滚)。然而,这里又有几个问题:

1、Oracle如何确定读取哪些redo log进行日志的前滚。

2、REDO LOG中存在部分不需要前滚的数据,比如,数据已经提交,或者,数据文件的数据是最新的,而redo log中的数据,反而是老旧的,如果覆盖,就会出现大问题。这个是如何识别的?

二、SCN相关概念

SCN是一串自增的数字,由DBMS按照相关算法,将时间转换而成,用来记录oracle数据库的数据更新,标识数据库在某个确切时刻提交的版本。当执行事务时(DML语句、DDL语句),系统会为每个事务变化生成相应的SCN。当备份数据文件时,备份文件会记录备份点的SCN值,当恢复时,oracle会从备份点的SCN值开始恢复,一直到失败点的SCN值。scn在数据库中是无处不在的,常见的事务表,控制文件,数据文件头,日志文件,数据块头等都记录有scn值.冠以不同前缀,scn也有了不同的名称,比如检查点scn(checkpoint scn),resetlogs scn等。SCN有一下四个:系统SCN、数据文件SCN、结束SCN、开始SCN。

1、系统 SCN

针对整个数据库的一个时间戳,所以只有一个。

2、数据文件 SCN

针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份。

3、结束SCN(Stop SCN)

记录的是日志文件中最老的ACTIVE文件的FIRST SCN号或者CURRENT的FIRST SCN号。实例恢复需要用到ACTIVE和CURRENT的日志文件。

结束SCN为空,表明数据库非正常关闭。如果正常关闭,系统scn、数据文件scn和结束scn应该是一样的。

实例恢复时,需要用到这三个SCN来确定要哪些日志文件做恢复,需要用到LRBA来确定从哪个记录开始恢复。

4、开始SCN(Start SCN)

三、SCN的应用场景

1、数据库正常的关闭和启动

数据库正常关闭时,系统会执行一个完全检查点动作,并用该检查点时的SCN号更新上述4个SCN号,这时所有数据文件的终止SCN号会设置为数据文件头的那个启动SCN(除了离线和只读的数据文件)。

数据库重新启动时,Oracle将数据文件头中的启动SCN与数据文件检查点SCN比较,如果这两个值匹配,Oracle接下来再比较数据文件头中的SCN和控制文件中数据文件的终止SCN,如果这个值也匹配,就意味着所有数据块已经提交,因此数据 库不需要进行恢复,此时数据库直接打开。当所有的数据文件都打开之后,在线且可读写的数据文件终止SCN再次被设置为NULL,表示数据文件已经打开并能 够正常使用了。有些表空间是只读的,这时控制文件中的系统检查点SCN号会不断增长,而数据文件SCN号和文件头中的启动SCN(会停止更新直到表空间又 设置为可读写),显然这时系统检查点SCN号会大于数据文件SCN和文件头启动SCN。

2、数据库正常的关闭和启动

数据库非正常关闭 ( 或称为实例崩溃 ) 时,终止 SCN 不会被设置,依然为 NULL ,这可以通过把数据库启动至 mount 状态查询出来。 这样重新启动时,SMON进程 会执行实例恢复工作,即先执行前滚、回滚操作,再把数据库打开。

3、数据文件介质故障

出现介质故障时,数据文件检查点SCN及系统检查点SCN比文件头启动SCN大。系统发生介质故障时,数据文件被以前的备份代替,控制文件中的数据文件检查点SCN肯定比文件头中的启动SCN要大,这样Oracle就知道要对这个文件进行介质恢复。

4、控制文件介质故障

系统检查点SCN及数据文件SCN比数据文件头启动SCN小:在数据库恢复时,控制文件可能不是最新的,即把一个较早的控制文件还原为当前的控制文件,然后再执行恢复操作,这时控制文件中的系统检查点SCN和数据文 件SCN可能比文件头的启动SCN小。这时恢复数据库要用下面命令:recover database using Backup Controlfile或其他的恢复语句。

5、备份时的实例崩溃

当执行begin backup时实例崩溃:控制文件中的数据文件检查点SCN号和数据文件头部检查点SCN号相同,但是每个可读写的在线数据文件之间检查点SCN号不同, 那么要求介质恢复,例如发出begin backup命令后就会出现这种情况,需要通过end backup命令好才可以打开数据库。

6、日志空跑

在oracle数据库中,每一个数据块、日志都有相对应的SCN号。在实例崩溃,日志前滚的过程中,oracle会比较每个待前滚的日志块,如果日志块的SCN比数据文件的SCN号低,则表明数据文件的数据较新,则不会覆盖数据文件上的块,这样就形成日志空跑。日志空跑保证了跑日志过程中的数据一致性。

SCN的更多相关文章

  1. oracle中scn(系统改变号)

    系统scn:                 select checkpoint_change# from v$database; 文件scn:                 select name ...

  2. oracle通过修改控制文件scn推进数据库scn

    数据库当前scn 代码如下 复制代码 idle> select checkpoint_change# from v$database; CHECKPOINT_CHANGE#----------- ...

  3. 打完补丁后测试db_link对SCN的影响

    环境:11.2.0.4.0 升 11.2.0.4.8 后测试 背景:oracle 的db_link会导致实例间SCN同步,SCN增长速度过快则会产生错误: 方案:oracle官方推荐升级版本,但升级之 ...

  4. dataguard 归档丢失(主库中无此丢失归档处理),备库基于SCN恢复

    dataguard 归档丢失(主库中无此丢失归档处理),备库基于SCN恢复 环境: OS: CentOS 6.5 DB: Oracle 10.2.0.5 1.主备库环境 主库: SQL> sel ...

  5. 【练习】flashback基于scn的闪回查询

    1.创建表dept1: :: SCOTT@ORA11GR2>create table dept1 as select * from dept; Table created. :: SCOTT@O ...

  6. SCN试验之二 checkpoin scn 与数据库scn的关系

    oracle11g 观察数据库scn: SQL> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHA ...

  7. SCN试验之一

    在数据库运行的时候,数据库系统的SCN不断地增长: SQL> select dbms_flashback.get_system_change_number from dual; GET_SYST ...

  8. Oracle的SCN与检查点机制

    Oracle的SCN与检查点机制 SCN在Oracle的文档上以多种形式出现,一种是System Change Number,另一种是System Commit Number,在大多数情况下,Syst ...

  9. 转--Oracle DB 服务器系统时间修改问题与 SCN 关系的深入研究

    论坛里一个朋友说将DB 服务器系统时间往往后修改了3个月(从11年改成10年),启动DB报600的错误. 一. 先做个测试 1.1 关闭DB SQL> shutdown immediate Da ...

随机推荐

  1. C 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)

    最熟悉的陌生人 作者:张慧桥 “枪与玫瑰” 我送走了“蝶恋花”,犹有一种身在梦中的感觉,昨晚的宿醉让我只觉得头晕乎乎的很不舒服,想想自己连澡都还没洗呢,便去洗了个冷水澡. 煮了杯浓浓的咖啡喝了下去,我 ...

  2. PHP 模拟POST请求

    /** * 模拟post进行url请求 * @param string $url * @param array $post */ function request_post($url, $post = ...

  3. Date和Calendar时间操作常用方法及示例

    package test; import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date; /** ...

  4. 【巩固】JS中的封闭空间

    封闭空间的主要思想在于: JS中给一个变量外面加小括号,是不改变任何结果的.比如 var show = function(){ //定义一个名字为show的函数 ); }; show(); //调用名 ...

  5. SQL语句之备份表

    SELECT INTO 语句:表示从一个表中选取数据,然后把数据插入另一个表中,常用来备份一张表 1.全表结构备份: SELECT * INTO new_table_name FROM old_tab ...

  6. 无废话WCF

    1.什么是WCF 2.WCF应用的通信过程 3.WCF宿主 4.WCF配置文件 5.WCF通信模式 6.一个简单的DEMO

  7. Redis数据库入门教程

    [使用redis客户端] 我们直接看一个例子: 复制代码 代码如下: //这样来启动redis客户端了 $ ./redis-cli //用set指令来设置key.value 127.0.0.1:637 ...

  8. 解决类似 Requires: libstdc++.so.6(GLIBCXX_3.4.15)(64bit)的问题

    源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found的问题.这 ...

  9. SQLAlchemy query with OR/AND/like common filters

    http://www.leeladharan.com/sqlalchemy-query-with-or-and-like-common-filters Some of the most common ...

  10. LAN-LAN FREE-SERVER FREE

    注:本文转自http://taotao1240.blog.51cto.com/731446/839702 CU上有个板块叫“存储备份”,可见存储和备份是紧紧联系的.在看备份的时候,经常能看到LAN f ...