1.1. SCN的概念

SCN(System Change Number,系统改变号)是顺序递增的一个数字,在Oracle 中用来标识数据库的每一次改动,及其先后顺序。SCN的最大值是0xffff.ffffffff。

1.2. SCN的管理方式

Oracle对SCN的管理,分为单节点和RAC两种方式。

单节点的instance中

单节点的instance中,SCN值存在SGA区,由system commit number latch保护。任何进程要得到当前的SCN值,都要先得到这个latch。

RAC/OPS环境中

Oracle通过排队机制(Enqueue)实现SCN在各并行节点之间的顺序增长。具体有两种方法:

Lamport算法:又称面包房算法,先来先服务算法。跟很多银行采用的排队机制一样。客户到了银行,先领取一个服务号。一旦某个窗口出现空闲,拥有最小服务号的客户就可以去空闲窗口办理业务。

Commit广播算法:一有commit完成,最新的SCN就广播到所有节点中。

上述两种算法可以通过调整初始化参数max_commit_propagation_delay来切换。在多数系统 (除了Compaq Tur64 Unix)中,该参数的默认值都是700厘秒(centisecond),采用Lamport算法。如果该值小于100厘秒,Oracle就采用广播算法,并且记录在alert.log文件中。

1.3. 几种重要的SCN

Commit SCN

当用户提交commit命令后,系统将当前scn赋给该transaction。这些信息都反映在redo buffer中,并马上更新到redo log 文件里。

Offline SCN

除了System tablespace以外的任何表空间,当我们执行SQL>alter tablespace … offline normal命令时,就会触发一个checkpoint,将内存中的dirty buffer写入磁盘文件中。Checkpoint完成后,数据文件头会更新checkpoint scn和offline normal scn值。其中数据库文件头的checkpoint scn值可通过查询列x$kccfe.fecps得到。

如果执行SQL>alter tablespace …offline命令时采用temporary或 immediate选项,而不用normal选项时,offline normal scn会被设成0。这样当数据库重启后通过resetlog方式打开时,该表空间就无法再改回在线状态。

Checkpoint SCN

当数据库内存的脏数据块(dirty blocks)写到各数据文件中时,就发生一次checkpoint。数据库的当前checkpoint scn值存在x$kccdi.discn中。Checkpoint scn在数据库恢复中起着至关重要的作用。无论你用何种办法恢复数据库,只有当各个数据库文件的checkpoint scn都相同时,数据库才能打开。

虽然参数“_allow_resetlogs_corruption”可以在checkpoint scn不一致时强制打开数据库,但是这样的数据库在open后必须马上作全库的export,然后重建数据库并import数据。

Resetlog SCN

数据库不完全恢复时,在指定时间点后的scn都无法再应用到数据库中。Resetlog时的scn就被设成当前数据库scn,redo log也会被重新设置。

Stop SCN

Stop scn记录在数据文件头上。当数据库处在打开状态时,stop scn被设成最大值0xffff.ffffffff。在数据库正常关闭过程中,stop scn被设置成当前系统的最大scn值。在数据库打开过程中,Oracle会比较各文件的stop scn和checkpoint scn,如果值不一致,表明数据库先前没有正常关闭,需要做恢复。

High and Low SCN

Oracle的Redo log会顺序纪录数据库的各个变化。一组redo log文件写满后,会自动切换到下一组redo log文件。则上一组redo log的high scn就是下一组redo log的low scn。

在视图v$log_history中,sequence#代表redo log的序列号,first_change#表示当前redo log的low scn,列next_change#表示当前redo log的high scn。

SQL> col recid format 9999

SQL> col requence# format 9999

SQL> col first_change# format 9,999,999,999,999

SQL> col next_change# format 9,999,999,999,999

SQL> select recid,sequence#,first_change#,next_change# from v$log_history where rownum<6;

RECID SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#

----- ---------- ------------------ ------------------

484 484 1,928,645,840,091 1,928,645,840,436

485 485 1,928,645,840,436 1,928,645,840,636

486 486 1,928,645,840,636 1,928,778,045,209

487 487 1,928,778,045,209 1,929,255,480,725

488 488 1,929,255,480,725 1,930,752,214,033

1.4. SCN号与oracle数据库恢复的关系

SCN号与oracle数据库恢复过程有着密切的关系,只有很好地理解了这层关系,才能深刻地理解恢复的原理,从而才能很好地解决这方面的问题。

SCN与CHECKPOINT

CKPT进程在checkpoint发生时,将当时的SCN号写入数据文件头和控制文件,同时通知DBWR进程将数据块写到数据文件。

CKPT进程也会在控制文件中记录RBA(redo block address),以标志Recovery需要从日志中哪个地方开始。与checkpoint相关的SCN号有四个,其中三个存在控制文件中,一个存放在数据文件头中。

这四个分别是:

1.System Checkpoint SCN当checkpoint完成后,ORACLE将System Checkpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询:

select checkpoint_change# from v$database;

2.Datafile Checkpoint SCN

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

select name,checkpoint_change# from v$datafile;

3.Start SCN号ORACLE将Start SCN号存放在数据文件头中。

这个SCN用于检查数据库启动过程是否需要做media recovery.

我们可以通过以下SQL语句查询:

select name,checkpoint_change# from v$datafile_header;

4.End SCN号ORACLE将End SCN号存放在控制文件中。

这个SCN号用于检查数据库启动过程是否需要做instance recovery.

我们可以通过以下SQL语句查询:

select name,last_change# from v$datafile;

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

我们作个小的试验,内容如下:

在执行检查点进程之前SCN号如下:

System Checkpoint SCN 4609061

--select checkpoint_change# from v$database;

Datafile Checkpoint SCN 4609061

--select name,checkpoint_change# from v$datafile;

Start SCN 4609061

--select name,checkpoint_change# from v$datafile_header;

End SCN 空

--select name,last_change# from v$datafile;

执行alter system checkpoint。后的SCN号如下:

System Checkpoint SCN 4609630

--select checkpoint_change# from v$database;

Datafile Checkpoint SCN 4609630

--select name,checkpoint_change# from v$datafile;

Start SCN 4609630

--select name,checkpoint_change# from v$datafile_header;

End SC 空

--select name,last_change# from v$datafile;

SCN不连续原因可能如下:1.当发生日志组切换的时候

2.当符合LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,fast_start_io_target,fast_start_mttr_target参数设置的时候

3.当运行ALTER SYSTEM SWITCH LOGFILE的时候

4.当运行ALTER SYSTEM CHECKPOINT的时候

5.当运行alter tablespace XXX begin backup,end backup的时候

6.当运行alter tablespace ,datafile offline的时候;

1.4.1. SCN号与数据库启动

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

1.4.2. SCN号与数据库关闭

如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应数据文件的Start SCN号。

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

1.4.3. 为什么需要System checkpoint SCN号与Datafile Checkpoint SCN号

为什么ORACLE会在控制文件中记录System checkpoint SCN号的同时,还需要为每个数据文件记录

Datafile Checkpoint SCN号?

原因有二:

1.对只读表空间,其数据文件的Datafile Checkpoint SCN、Start SCN和END SCN号均相同。

这三个SCN在表空间处于只读期间都将被冻结。

2.如果控制文件不是当前的控制文件,则System checkpoint会小于Start SCN或END SCN号。记录这些SCN号,可以区分控制文件是否是当前的控制文件。

1.4.4. Recovery database using backup controlfile

当有一个Start SCN号超过了System Checkpoit SCN号时,则说明控制文件不是当前的控制文件,因此在做recovery时需要采用using backup controlfile。这是为什么需要记录SystemCheckpoint SCN的原因之一。

这里需要一提的是,当重建控制文件的时候,System Checkpoint SCN为0,Datafile Checkpoint SCN的数据来自于Start SCN。根据上述的描述,此时需要采用using backup controlfile做recovery。

转自:oracle数据库scn是什么,深入了解ORACLE数据库的SCN_黑科技玩机的博客-CSDN博客

oracle数据库scn是什么相关推荐

  1. oracle数据库6月之后的数据,Oracle数据库SCN存在可能在2019年6月导致宕机问题

    当前的问题 Oracle日前发布了两个公告在其官网上,简单描述为对应的数据库都需要打上对应的最小补丁,否则在2019年6月的时候可能会导致大范围宕机的情况. SCN是System Change Num ...

  2. oracle数据库的scn,Oracle数据库SCN详解

    SCN号概述 SCN是当Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字.Oracle数据库中一共有4种SCN分别为 系统检查点SCN: 系统检查点SCN位于控制文件中,当检查点进程启 ...

  3. oracle数据库scn是什么,深入了解ORACLE数据库的SCN

    1. 深入了解oracle数据库的SCN 1.1. SCN的概念 SCN是顺序递增的一个数字,在Oracle 中用来标识数据库的每一次改动,及其先后顺序.SCN的最大值是0xffff.ffffffff ...

  4. mysql中的scn,oracle数据库SCN概念

    目录 1.SCN的介绍 2.SCN的工作机制 3.SCN的增加 4.其他的SCN 5测试 6小结 7问题 1.SCN的介绍 Oracle中的SCN有下面几种: 1)系统检查点scn(v$databas ...

  5. oracle scn参数,【学习笔记】Oracle数据库使用_MINIMUM_GIGA_SCN推进SCN案例

    天萃荷净 Oracle研究中心学习笔记:分享一篇关于Oracle数据库SCN故障解决办法,使用_MINIMUM_GIGA_SCN推进SCN案例. 最近帮朋友弄一个WIN环境的数据库,需要增加SCN值, ...

  6. oracle scn 作用,Oracle中scn讲解

    SCN System Change Numbers (SCNs)&System Commit Numbers(系统改变号&系统提交号) A system change number ( ...

  7. oracle transaction scn,关于Oracle DB SCN 生成率过高的 预警及处理建议

    关于Oracle DB SCN 生成率过高的 预警及处理建议 Oracle SCN简介: Oracle SCN(SystemChange Number),又名系统更改号,是Oracle数据库内部的一个 ...

  8. oracle数据库修改写入状态,【学习笔记】Oracle oradebug 使用oradebug修改数据库SCN方法案例...

    天萃荷净 使用oradebug修改数据库scn,使用oradebug修改数据库scn的案例. 这里也做了两个测试,发现该功能确实很巧妙,通过修改内存中的scn值,然后写入控制文件和数据文件,实现修改s ...

  9. SCN Headroom与时光倒流到1988年的Oracle数据库

    最近一阵关于scn headroom的讨论很热,  这是由于在最新的2012 Apr的PSU中例如10.2.0.5上的PSU 13632743和 patch  13916709: SCN: HIGH ...

最新文章

  1. 使用Wasserstein距离鉴别器的无监督图对齐
  2. NUC1312 Sum【水题+数学题】
  3. 小强学渲染之OpenGL渲染管线详析
  4. *args,**kwargs的使用方法
  5. 二进制包 mysql_二进制包安装MySQL数据库
  6. 第三届“空间信息网络”学术论坛诚邀您的参加
  7. 统计学习方法-李航(2)
  8. Ubuntu Touch 预览版安装过程解析
  9. ElasticSearch:图解ElasticSearch的搜索过程
  10. 电脑计算器_哪几种计算器可以携带入考场!注会考试忘带计算器了怎么办?
  11. Jensen不等式简介及推导
  12. 阿里的数据同步神器——Canal
  13. golang正则匹配中文字符,查询中文字符会panic退出的问题
  14. LeetCode 592
  15. [论文笔记] ASFD 阅读笔记
  16. 数学建模学习(98):CHIO优化算法
  17. Handing Incomplete Heterogeneous Data using VAEs
  18. 最近很多人问我:saiku下载不下来
  19. 阻碍你登上成功宝座的20大不良习惯
  20. OPC (OLE for Process Control)

热门文章

  1. STM32——定时器中断实验
  2. HLS直播预取视频并更新m3u8
  3. 解决Linux下部署使用JasperReport的项目的错误:net.sf.jasperreports.engine.util.JRFontNotFoundException: Font '宋体' i
  4. 计算机工作表编辑,Excel工作表编辑与管理
  5. 微信小程序 之 rich-text 长按复制事件
  6. 页面禁止长按保存图片和长按复制文字
  7. 如何下载 spring 官方文档 pdf
  8. 查询一个月的全部日期
  9. 计算机科学与技术高等数学答案,计算机科学与技术本科-入学测试高等数学测试题(第1套)...
  10. 有网络但是网页打不开的问题