一,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. HDU 1540 Tunnel Warfare (线段树或set水过)

    题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...

  2. 创建Database Diagrams时遇到的问题

    SQL2008 R2中时,Diagrams的问题 Error: ------------------------------ Database diagram support objects cann ...

  3. mysql 时间戳转换为日期

    from_unixtime(time); from_unixtime(time,'%Y%m%d'); from_unixtime(time,'%Y年%m月%d日');

  4. Effective Java笔记

    chapter 1 java支持四种类型:interface,class,array,primitive(基本类型) chapter 2 创建对象方式: ①构造器 ②静态工厂方法代替构造器:名称可以按 ...

  5. loj #2116. 「HNOI2015」开店

    #2116. 「HNOI2015」开店 题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的想法当然非 ...

  6. Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...

  7. 停止memcached服务

    telnet 127.0.0.1 11211 进入memcache stats 查看pid号 退出memcache kill -9 pid号

  8. P4855 MloVtry的idea

    $ \color{#0066ff}{ 题目描述 }$ MloVtry是一个脑洞很大的人,它总会想出一些奇奇怪怪的idea. 可问题是,MloVtry作为一个蒟蒻,很多时候都没办法解决自己提出的问题,所 ...

  9. [I/O]一览图

  10. eazyui 或bootstrap table表格里插入图片,点击查看大图

    columns: [ {field: 'state',checkbox: true,align: 'center',valign: 'middle'}, {field: 'contacts',sort ...