1.2 进阶内容:

两个概念:SCN 和 检查点 

1.SCN的定义:

    system change member ,系统改变号,是数据库中非常重要的一个数据结构。

    SCN 用以标示数据库在某个确切时刻提交的版本。在事务提交时,它被赋予一个唯一的标识事务的SCN 。SCN同时被作为Oracle数据库的内部时钟机制,可被看做逻辑时钟,每个数据库都有一个全局的SCN生成器。

    作为数据库内部的逻辑时钟,数据库事务依SCN而排序,ORACLE也依据SCN来实现一致性读(Read Consistency)等重要数据库功能。另外对分布式事务(Distributed Transactions),SCN也极为重要。

    SCN在数据库中是唯一的,并随时间而增加,但是可能并不连贯。除非重建数据库,SCN的值永远不会被重置为零。

    重要的是:1.SCN是Oracle的内部时钟机制;2.通过SCN来维护数据的一致性;3.通过SCN实现Oracle至关重要的恢复机制;

    常见的事务表、控制文件、数据文件头、日志文件、数据块头等都有记录SCN值。

    冠以不同的前缀,SCN有不同名称,如检查点SCN(Checkpoint SCN)、Resetlogs SCN等。

 2.SCN的获取方式:

    可以通过以下方式获取数据库当前的或近似的SCN.

    从Oracle i9开始,可以使用 dbms_flashback.get_system_change_number 来获得:

select dbms_flashback.get_system_change_number from dual;

 3.SCN的进一步说明:

系统的SCN并不是时时改变,通常在事务提交或回滚时改变。在控制文件,数据文件头、数据块、日志文件头、日志文件change vector中都有SCN,但是作用各不相同。

(1)数据头文件中包含了改数据文件的Checkpoint SCN ,表示该数据文件最近一次执行检查点操作的SCN.

     从控制文件的dump文件,看到内容:

对于每一个数据文件都包含一个这样的条目,记录该文件的检查点SCN的值以及检查点发生时间,这里的Checkpint SCN, Stop SCN以及Checkpoint Cnt 都是非常重要的数据结构。

(2) 日志文件头包含了 Low SCN 和 Next SCN

Low SCN 和 Next SCN 这两个SCN表示该日志文件包含有介于 Low SCN 和 Next SCN 的重做信息,对于Current的日志文件(当前正在被使用的 Redo Logfile) ,最终的SCN不可知,所以SCN被置为无穷大,ffffffff;

  

 1.2.2 检查点 :

1.检查点(Checkpoint)的本质:

    检查点只是一个数据库事件,它存在的根本意义在于减少奔溃恢复的(Crash Recovery)时间。

    当修改数据时,需要首先将数据读入内存中(Buffer Cache),修改数据的同时,Oracle会记录重做信息(Redo)用于恢复。因为有了重做信息的存在,Oracle不需要在提交时立即将变化的数据写入磁盘(立即写的效率会很低),

重做的存在正是为了在数据库奔溃之后,数控可以恢复。

    最常见的情况,数据库可能因为断电而Crash,那么内存中修改过的、尚未写入文件的数据将会丢失。在下一次数据库启动之后,Oracle可以通过重做日志进行事务重演(也就是进行前滚),将数据库恢复到崩溃之前的状态,然后数据库

可以打开提供使用,之后Oracle可以将未提交的事务进行回滚。

    检查点的存在就是为了缩短这个恢复时间。

    当检查点发生时(此时的SCN被称为Checkpoint SCN),Oracle 会通知DBWR进程,把修改过的数据,也就是次Checkpoint SCN 之前的脏数据(Dirty Data)从 Buffer Cache 写入磁盘,当写入完成之后,CKPT进程更新控制文件和数据文件头,记录检查点信息,标识变更。

   在检查点完成之后,次检查点之前修改过的数据都已经写回磁盘,重做日志文件中的相应重做记录对于崩溃实例恢复不再有用。

    从图1.1 可以看出,检查点的频度对于数据库的恢复时间具有极大地影响 ,如果检查点的频率高,那么恢复时需要应用的重做日志就相对的少,恢复时间就可以缩短。

但是,数据库内部操作的相关性极强,过于频繁的 检查点同样会带来性能问题, 尤其是更新频繁的数据库。所以数据库的优化是一个系统工程,不能草率。

    更进一步,如果Oracle可以在性能的允许下,使得SCN逐步逼近Redo的最近更新,那么最终可以获得一个最佳平衡点,使得Oracle可以最大化的减少恢复的时间。

    为了实现这一目标,Oracle在不同版本中一直在改进检查点的算法,

    2.常规检查点和增量检查点:

    为了区分,在Oracle 8 以前,Oracle实施的检查点通常被称为常规检查点(Conventional Checkpoint) ,这类检查点按照一定的条件触发。

   从Oracle 8 开始,Oracle 引入了增量检查点,(Incremental Checkpoint)的概念。

    新版本Oracle主要引入了检查点队列(Checkpoint Queue)机制,在数据库内部,每一个脏数据都会移动到检查点队列,按照Low RBA 的顺序(第一次对此数据块修改对应的Redo Byte Address)来排队,

如果一个数据块进行过多次修改,该数据块在检查点队列上的顺序并不会发生变化。

 当执行检查点时,DBWR从检查点队列按照 Low RBA 的顺序写出,实例检查点因此可以不断增进、阶段性的,CKPT 进程使用非常轻量级的控制文件更新协议,将当前的最低RBA写入控制文件。

     因为增量检查点可以连续的进行,因此检查点 RBA可以比常规检查点更接近数据库的最后状态,从而在数据库实例的恢复中可以极大地减少恢复时间。

 而且,通过增量检查点,DBWR 可以持续的进行写出,从而避免了常规检查点出发的峰值写入对I/O 的过度征用,如图1-2

    在数据库中,增量检查点是通过Fast-start Checkpoint 特性来实现的,通过查询 v$option 试图,了解这一特性:

    改组件包含3个主要特性,可以加快系统在故障后的恢复,提高系统的可用性。

  • Fast-Start  Checkpoing 
  • Fast-Start On-Demand Rollback
  • Fast-Start Parallel Rollback

    Fast-Start Checkpoint 特性在Oracle i8 中, 主要通过参数 FAST_START_IO_TARGET 来实现;在Oracle i9 中,Fast-Start Checkpoint 主要通过参数 FAST_START_MTTR_TARGET 来实现。

3. FAST_START_MTTR_TARGET 

    FAST_START_MTTR_TARGET 参数从 i9 开始被引入,该参数定义数据库进行Crash 恢复的时间,单位是秒,取值范围是0-3600秒之间。

    在Oracle i9中, Oracle推荐这个参数代替FAST_START_IO_TARGET、LOG_CHECKPOINT_TIMEOUT 及 LOG_CHECKPOINT_INTERVAL 参数。缺省情况下,FAST_START_IO_TARGET和FAST_START_IO_TARGET已经被设置为零。

    从Oracle 9i R2 开始,Oracle 引入了一个新的视图提供MTTR 建议:

 该视图评估在不同 FAST_START_MTTR_TARGET 设置下,系统需要执行的 I/O 次数等操作。用户可以根据数据库的建议,对该参数进行调整。

    这个建议信息的收集受到 ORACLE 9i 新引入的初始化参数 statics_level 的控制,该参数设置为typical 或 ALL 时,MTTR 建议信息被收集:

也可以通过 v$statistics_level 试图来查询 MTTR Advice 的当前设置:

    数据库当前的实例恢复状态可以通过试图 v$instance_recovery 查询得到:

    从 v$instance_recovery 视图,可以看到当前数据库估计的平均恢复时间(MTTR)参数: ESTIMATED_MTTR : 这个值的估算是基于 Dirty Buffer 的数量和日志块数量得出来的,也就是数据库崩溃实例恢复将需要的时间。

4. Oracle 10g 自动检测点调整:

从10g开始,数据库可以实现自动调整的检查点,数据库可以利用系统低 I / O ,负载时段写出内存中的脏数据,从而提高数据库的效率。

5.从控制文件获取检查点的信息:

    在控制文件的转储中,可以看到检查点进程进度的记录:

这里 low cache rba (recovery block address )指在Cache中,最低的RBA地址,在实例恢复中,需要从这里开始恢复。

  on disk rba 时磁盘上的最高重做值,在进行恢复时应用重做至少要恢复到这个值。

  1.2.3 正常关闭数据库的情况:

接下来看一下数据库是怎样根据 SCN 和 Checkpoint 来进行一致性判断及恢复控制的。

在控制文件和数据文件头上,对于每个数据文件都有一个“Checkpoint SCN”  和 “Stop SCN” ,这些Checkpoint 和 SCN至关重要,Oracle通过比较这些SCN来确定数据库是否需要恢复。

下面是一个来自 Clean Shutdown 的数据库的控制文件头的内容。

因为数据库在关闭之前执行了完全检查点,所以线程检查点SCN和所有数据文件检查点SCN和数据文件Stop SCN 都一致。

首先通过 shutdow immediate 关闭数据库,然后在Mount状态转储控制文件内容:

这个trace文件里就记录了控制文件的详细内容。

Redo信息

数据文件的检查点信息:

注意这里,数据库正常关闭之后,由于执行了完全检查点,数据库文件处于一致的状态,检查点SCN在此等于 Stop SCN .

在此情况下,由于 数据库处于一致状态,如果数据库文件没有损失,下次启动Oracle就能通过验证,顺利启动。

 

1.2.4 数据库异常关闭的情况

    通过 shutdown abort 可以模拟一次异常,当使用shutdown abort 方式关闭数据库时,Oracle立即中断所有事务,关闭当前所有数据库连接, 不执行检查点,立即关闭数据库。

使用这种方式关闭数据库和断点以前的故障类似,数据库在下一次启动时必须执行实例恢复才能够启动。除非特别紧急,通常不建议使用这种方式关闭数据库。

查看此时控制文件的内容:

1.数据库的相关信息:

在Database Entry 部分,可以看到数据库 Thread Checkpoint 信息:

2.控制文件记录的redo信息:

在控制文件中,也可以找到 REDO THREAD 检查点信息:

3.数据文件检查点信息:

    以下是控制文件中记录的数据文件检查点信息:

 注意,由于数据库异常关闭,数据库没有完成最后的检查点,数据文件的 stop SCN仍然为无穷大fffffff

    在以上的信息中, 各部分的Checkpoint SCN 都一致,但是数据库文件的stop SCN不等于checkpoint scn,数据库关闭时没有执行完全检查点,是异常关闭,此时启动数据库需要进行恢复。

4.数据库的实例恢复

    在数据库异常关闭之后,下次启动时,Oracle会自动执行实例恢复 Instance Recovery 实例恢复包括两个步骤:Cache Recovery 和 Transaction Recovery。

    继续以上的测试,在启动数据库之后可以从 alert_<sid>.log 文件中获得数据库关于恢复的相关信息:

Oracle恢复的过程, 首先读取日志, 从最后完成的检查点开始, 应用所有重做记录,这个过程叫做前滚 Rolling Forward ,也就是Cache Recovery 的过程,完成前滚之后,数据可以被打开提供访问和使用。

此后进入实例恢复的第二阶段,Oracle回滚未提交事务,使用 Fast-Start  On-Demand Rollback 和 Fast-Start   Parallel Rollback

 

P48

Oracle入门笔记 ——启动进阶的更多相关文章

  1. Oracle入门笔记 ——启动

    参考教材<深入浅出Oracle> 兴趣 + 勤奋 + 坚持 + 方法 ≍ 成功 DBA生存之四大守则 1.备份重于一切: 2.三思而后行: 3.rm是危险的: 4.你来制定规范: 第一章: ...

  2. C++ 快速入门笔记:进阶编程

    C++入门笔记:高级编程 文件和流 打开文件 void open (const char *filename, ios::openmode mode); ios::app 追加模式.所有写入都追加到文 ...

  3. oracle 入门笔记---分区表的分区交换

    本文参考来自作者:蓝紫 详细内容请阅读原文 : http://www.cnblogs.com/lanzi/archive/2013/01/24/2875838.html 在oracle 11.2环境下 ...

  4. oracle 入门笔记--v$sql和v$sqlarea视图(转载)

    转载于作者:dbtan 原文链接:http://www.dbtan.com/2009/12/vsql-and-vsqlarea-view.html v$sql和v$sqlarea视图: 上文提到,v$ ...

  5. Oracle学习笔记之四,SQL语言入门

    1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...

  6. Oracle学习笔记--Oracle启动过程归纳整理

    Oracle 启动过程分为nomount状态mount状态open状态 每个状态下Oracle都会进行不同的操作:1.nomount状态 在$ORACLE_HOME/dbs目录下寻找参数文件 参数文件 ...

  7. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

  8. redis入门笔记(1)

    redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...

  9. MySQL入门笔记

    MySQL入门笔记 版本选择: 5.x.20 以上版本比较稳定 一.MySQL的三种安装方式: 安装MySQL的方式常见的有三种: ·          rpm包形式 ·          通用二进制 ...

随机推荐

  1. @RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别

    1.@RequestMapping 国际惯例先介绍什么是@RequestMapping,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应 ...

  2. 06 Locking and Latching

    本章提要---------------------------------------------------------------6,7,8,9,10,11 这 6 章要细看, 从本章开始how ...

  3. 回调方法介绍之中国好室友篇(Java示例)

    前言 在Java社区的各种开源工具中,回调方法的使用俯拾即是.所以熟悉回调方法无疑能加速自己对开源轮子的掌握.网上搜了一些文章,奈何对回调方法的介绍大多只停留在什么是回调方法的程度上.本篇文章尝试从回 ...

  4. Spring Annotation是怎么工作的?

    最近刚好看了下注解,虽然明白了注解的作用原理,但是仍然不明白Spring中的注解是如何工作的. 占座用,留待后续. 先来两个链接吧 https://dzone.com/articles/spring- ...

  5. e557. 在Applet中显示图片

    See also e551 精简的Applet. Image image; public void init() { // Load image image = getImage(getDocumen ...

  6. const 与#define 的比较

    const 与#define 的比较 C++ 语言可以用 const 来定义常量,也可以用 #define 来定义常量.但是前者比后 者有更多的优点: (1) const 常量有数据类型,而宏常量没有 ...

  7. ubuntu下使用VI编辑文件必知的常用命令

    进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...

  8. 世界上最痛苦的事就是去改别人的bug!!!!

    世界上最痛苦的事就是去改别人的bug!!!!

  9. storm深入研究

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:He Ransom链接:http://www.zhihu.com/question/23441639/answer/28075 ...

  10. .net cs后台刷新aspx页面的四种方式

    一:Response.Redirect(Request.Url.ToString()); 二:Response.Write("<script language=javascript&g ...