一,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. 特殊的HttpApplication事件处理

    在global.asax中,针对HttpApplication的事件处理,可以通过定义特殊命名的方法来实现.首先,这些方法必须符合System.EventHandler,因为所有的HttpApplic ...

  2. 解决iReport打不开的一种方法

    解决iReport打不开的一种方法 iReport版本:iReport-5.6.0-windows-installer.exe 系统:Win7 64位 JDK:1.7 在公司电脑安装没问题,能打开,但 ...

  3. shell 字符串中定位字符位置 获取字符位置

    linux shell 字符串操作(长度,查找,替换)详解 该博文中描述的如下两个字符串操作, ${string:position} #在$string中, 从位置$position开始提取子串 ${ ...

  4. 激光样式——第九届蓝桥杯C语言B组(国赛)第二题

    原创 标题:激光样式x星球的盛大节日为增加气氛,用30台机光器一字排开,向太空中打出光柱.安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开!国王很想知道,在目前这种bug存在的情况下, ...

  5. wc.exe C++实现

    目录 Github项目地址 PSP表格 解题思路 设计实现过程 测试运行 项目小结 Github项目地址 wc-project PSP表格 PSP2.1 Personal Software Proce ...

  6. Android Studio2.3更换默认的ConstraintLayout布局

    1.在as安装目录\plugins\Android\lib\templates\activities\common\root\res\layout下,找到simple.xml.ftl文件 2.用以下布 ...

  7. 【转】快速开发移动医疗App!开源框架mHealthDroid

    原文地址:http://www.csdn.net/article/2014-12-12/2823096-mHealhDroid mHealthDroid是一款开源的移动框架,主要用于帮助开发者快速而又 ...

  8. webform Response的一些成员

    1. Response.BufferOutPut,关闭缓冲区. 2. Response.Flush,一次性把缓冲区的内容释放出来. 3. Response.Clear,清空缓冲区. 4. Respon ...

  9. 生成MySql数据库的数据字典代码参考

    Code: /** * 生成mysql数据字典 */ //配置数据库 $dbserver = "127.0.0.1"; $dbusername = "root" ...

  10. mysql 复制(主从复制)

    一.概述 让一台服务器的数据与其他服务器数据保持同步.一台主库的数据可以同步到多台备库上,而备库本身也可以配置成其他服务器的主库. 主要应用: 1) 数据分布 2) 负载均衡 3) 伪备份.在备份基础 ...