一,SCN的介绍

      SCN(System Change Number),也就是通常所说的系统改变号或者系统提交号,是数据库中非常重要的一个数据结构。

   SCN用以标识数据库在某个确切时刻提交的版本。在事务提交时,它被赋予一个唯一的标识事务的SCN。SCN同时被作为Oracle数据库的内部时钟机制,可被看做逻辑时钟,每个数据库都有一个全局的SCN生成器。SCN在数据库中是唯一的,并随时间而增加,但是可能并不连贯。除非重建数据库,SCN的值永远不会被重置为0.

二,SCN作用

  01,一致性读

  02,保证事务的唯一性

  03,物理备份恢复机制重要的判断点     

三,常见的SCN

  01,控制文件中的SCN

      1.1  数据库SCN

    数据库SCN表示最近一次全量checkpoint操作时的SCN

        

      1.2 数据文件SCN

    通过 V$DATAFILE查询保存在控制文件中的数据文件SCN

        数据文件头SCN

        

        STOP SCN

        数据库打开或异常关闭,该值为空或无穷大0xffffffffffffffff

        

      1.3 CHECKPOINT PROGRESS RECORDS中的SCN

        CHECKPOINT PROGRESS RECORDS中的on disk scn表示当前系统最新rba对应的scn,有ckpt进程每3秒更新一次。

  02,数据文件头的SCN

      creation_change#

        数据文件创建时的SCN

        

      checkpoint_change#

        表示数据文件头当前的SCN

        

      resetlogs_change#

        表示数据库以resetlogs方式打开时的SCN,在dump的控制文件中也能看到Resetlogs scn

        转换成十进制就是页面显示的SCN

          

      change#

        表示数据文件冻结时的SCN。在做数据文件在线热备时,常用begin backup命令将数据文件头冻结,表明chang#这个点开始对数据文件进行备份

        

      操作以下:

        

  03,数据块的SCN 

      数据块变化时的SCN

      数据块事务槽中的SCN

      数据块中数据行的SCN

  04,日志文件头的SCN

      FISRT_CHANGE#

        表示该在线日子文件被重用时的SCN

      NEXT_CHANGE#

        表示该日志文件重用结束时的SCN

      RESETLOGS_CHANGE#

        表示数据库已RESETLOGS方式打开时的SCN。通常和数据文件头的RESETLOGS_CHANGE#相同

  05,事务开始时的SCN

  06 数据库的CURRENT SCN

  07,操作是否刷新SCN号码

SCN\操作

日志切换

全量检查点

正常关闭


增量检查点

刷新缓存

offline

系统检查点SCN

×/√

√

√

×

√

×

文件检查点SCN

×/√

√

√

×

√

×

文件最终检查点SCN

×

×

√

×

×


×

文件头部检查点SCN

×/√

√

√

×

√


√(表空间对应数据文件)

日志文件开始SCN

√

×

×

×

×


×

日志文件结束SCN

√

×

×

×

×


×

RedoLog条目SCN

×

×

×

×

×


×

四,检查点与SCN

  01、完全检查点

    当完全检查点发生时,ckpt进程会触发DBwriter进程把所有脏块写入磁盘上。

  02、增量检查点

    当增量检查点发生时:
      1、ckpt进程会把检查点队列的第一个被脏的数据块所对应的日志地址记录到控制文件。
      2、当检查点队列连接的脏块太多以及系统的I/O不是很忙,这是会触发DBwriter将最早脏的数据块部分写入磁盘上来缩短检查点队列。

    

  03、当Oracle正常关闭时会触发完全检查点

    当Oracle在正常运行期间每隔3秒发生一次增量检查点。 每个数据块中都有两个日志地址:LRBA和HRBA

    RBA:数据块日志地址

    LRBA:数据块第一次被脏的日志地址
    HRBA:数据块最近一次被脏的日志地址

    Log writer进程每隔3秒会将log buffer cache里面的日志写到当前联机日志里(current redo log)。
    

    on disk RBA:是current redo log里面的最后一条日志的地址(即current redo log 里面最新一条日志的地址)。

  04、实例崩溃恢复过程(Oracle自动恢复):

    找起点,确定终点,跑日志(前滚)

    1、Oracle发现实例非正常关闭需要做实例恢复

    2、Oracle在控制文件中通过LRBA地址找到日志的起点
    3、Oracle从日志的起点开始跑,跑到redo log的最后一条日志
    4、Oracle跑日志跑到终点时,保证所有已提交事物的脏块全部被构造出来,同时一些未提交事物的脏块也被构造出来,Oracle会自动将崩溃前为提交的事物进行回滚
    注:实例恢复需要联机日志(不需要归档日志)
SCN知识点

 ①数据库正常启动时,控制文件中系统SCN、文件SCN和数据文件中的起始SCN号应该是相
同的,结束SCN是空(可以理解为无穷大)。
②数据库正常关闭时,用关闭的时间点SCN去更新控制文件中系统SCN、文件SCN、结束
SCN和数据文件中的起始SCN。
③数据库非正常关闭时,控制文件中系统SCN、文件SCN和数据文件中起始SCN为崩溃时的
时间点的SCN,而控制文件中的结束SCN为空,下次启动时,Oracle检查到系统SCN、文件
SCN和起始SCN一样,唯独结束SCN为空,则认为需要做实例恢复。
④数据库正常运行时,当发生脏块写入磁盘时,及redo log里面的active(日志所对应
的脏缓存区还没写入磁盘)变为inactive(日志所对应的脏缓存区已经写入磁盘),则ckpt会用redo log里最老的active的first SCN更新系统SCN、文件SCN和起始SCN。
⑤当用旧的数据文件、控制文件替代新的,然后启动数据库,Oracle发现控制文件里面的系统SCN和current redo log的SCN低,则Oracle会通过跑日志,把旧的数据文件,控制文件跑成最新。

五,SCN恢复实例

  01,创建表,并且插入数据

create table test1(a varchar2(10),b varchar2(10));
insert into t1 values('12345','67890');

   

    

   

   02,查看事务

    

  03,数据更改 

update test1 set a='abcde',b='fghij';

commit;

    

  04,数据恢复

    关闭数据库

    启动到mount

rman target /
RMAN> run{
set until scn 1491133;----这个SCN为刚刚查询的,也就是事故发生前
restore database;
recover database;
alter database open resetlogs;
}

    

    进入rman

    

    

  05,验证

    重新进入数据库查看即可

oracle 基础知识(三)--SCN的更多相关文章

  1. Oracle基础知识汇总一

    Oracle基础知识 以下内容为本人的学习笔记,如需要转载,请声明原文链接   https://www.cnblogs.com/lyh1024/p/16720759.html oracle工具: SQ ...

  2. java 基础知识三 java变量

    java  基础知识 三 变量 1.作用域 {} 包围起来的代码 称之为代码块,在块中声明的变量只能在块中使用 2.常量 就是固定不变的量,一旦被定义,它的值就不能再被改变. 3.变量 变量必须在程序 ...

  3. 图说Oracle基础知识(一)

    本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...

  4. Python基础知识(三)

    Python基础知识(三) 一丶整型 #二进制转成十进制的方法 # 128 64 32 16 8 4 2 1 1 1 1 1 1 1 例如数字5 : 101 #十进制转成二进制的方法 递归除取余数,从 ...

  5. oracle 基础知识(三)

    一.删除oracle 进入注册表到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleOraHome91TNSListener Ima ...

  6. Oracle 基础知识入门

    前记: 近来项目用到Oracle数据库,大学学了点,后面基本忘记得差不多了,虽然基本语法跟sql 差不多,但是oracle知识是非常多的. 这里简单说点基础知识,希望后面补上更多的关于ORacle知识 ...

  7. C# 基础知识 (三).主子对话框数值传递

    在C# winform编程中,我们经常会遇到不同窗口间需要传递数值的问题.比如数据库的应用,主窗口填写内容num1,点击按钮,在弹出的子窗口显示对应num1值;或者在子窗口填写新注册用户名信息,在主窗 ...

  8. 快速掌握JavaScript面试基础知识(三)

    译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...

  9. Dapper基础知识三

    在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. Dapper,当项目在开发的时候,在没有必要使用依赖注入的时候,如何做 ...

随机推荐

  1. razor自定义函数 @helper 和@functions小结

    from:http://www.cnblogs.com/jiagoushi/p/3904995.html asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的 ...

  2. Densely Connected Convolutional Networks(緊密相連卷積網絡)

    - Dense blocks where each layer is connected to every other layer in feedforward fashion(緊密塊是指每一個層與每 ...

  3. 关于modelsim闪退问题

    电脑之前做过仿真,modelsim是可以完美调用的,但是最近莫名其妙的就出现闪退问题,不通过quartus或者ise调用,单独使用的时候也会闪退. 偶尔一次能抓到错误消息.如下图所示: 然并卵,网上根 ...

  4. Android 中menu在activity中的使用

    1.在res下选择new  选择Android resource directory 2.在弹出框中Resource type选择menu 3.在res下就可以看到menu文件夹 4.在menu文件夹 ...

  5. 微软日志工厂 Microsoft.Extensions.Logging 中增加 log4net 的日志输出

    前提: 需要nuget   Microsoft.Extensions.Logging.Log4Net.AspNetCore   2.2.6: 描述:解决 .net core 微软日志工厂 Micros ...

  6. 选择性的使用 serialize() 进行序列化

    serialize 非常方便的帮我们创建 URL 编码文本字符串 输出的字符串格式为 a=1&b=2&c=3  直接可用于Url传参 下面介绍一下选择性的序列化某些标签的使用方法 将 ...

  7. 独立线程监控配置文件是否变更,适用于更新了配置文件,不需要重启tomcat服务

    直接贴出来代码: package cn.leadeon.utils.file; import java.io.File; import java.io.FileInputStream; import ...

  8. SKU:唯一标识填什么

    策略 随意填写 只要别和别人重复就好 ,不过重复你也创建不了. 最好填与APP信息相关的,比如直接填写bundle ID 上去...跟套装ID保持一致. 你新建应用的时候都还没有APP ID 你怎么填 ...

  9. Python3入门之软件安装

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 最近将我的Python笔记整理下,希望能对他人有所帮助,这是第一课,安装入门篇: windows下安装Python 1.下载,从这里下载:[下载链 ...

  10. c语言数据结构学习心得——栈

    栈(Stack) 只允许在一端进行插入或删除操作的线性表 栈顶(Top):栈中允许进行插入和删除操作的那一端: 栈底(Bottom):固定的,不允许进行插入或删除的另一端 1.栈是受限的线性表,所以自 ...