在恢复的内部控制上,Oracle数据库通过检查点和RBA信息来确定恢复范围,正常情况下,最后一个完成的检查点对应的RBA是恢复的起点(Cache-Low RBA),恢复能够达到的终点是On-Disk RBA,也就是最后一个写出到磁盘的REDO日志记录。在实例恢复中,Oracle数据库就将进行介于Cache-Low RBA和On-Disk RBA之间的自动实例恢复。

可以通过如下的测试过程来理解一下Oracle的恢复过程与控制。

首先执行一个建表的CTAS操作,这个操作是为了多生成一些脏块(Dirty Buffer),然后紧接着执行两次控制文件转储,两次转储是为了确认对比一下控制文件的检查点没有变化,然后紧接着执行强制关闭数据库(Abort方式),再启动数据库:

现在来分析一下跟踪文件,看看其中的相关信息,选取第二次转储的控制文件信息,在数据库Entry部分,可以找到检查点记录:

***************************************************************************

DATABASE ENTRY

***************************************************************************

(size = 316, compat size = 316, section max = 1, section in-use = 1,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 1, numrecs = 1)

07/31/2010 16:35:48

DB Name "ENMO"

Database flags = 0x00404000 0x00001000

Controlfile Creation Timestamp 07/31/2010 16:35:49

Incmplt recovery scn: 0x0000.00000000

Resetlogs scn: 0x0000.00089c75 Resetlogs Timestamp 07/31/2010 16:35:52

Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp 03/14/2008 18:46:22

Redo Version: compatible=0xa200300

#Data files = 4, #Online files = 4

Database checkpoint: Thread=1 scn: 0x0000.00119459

Threads: #Enabled=1, #Open=1, Head=1, Tail=1

此时记录数据库的检查点SCN是119459,这是16进制,10进制是1152089。

继续检查,在检查点进程记录部分,获得如下信息,这里就包含了Low Cache RBA和On Disk RBA的信息,也记录了Dirty Buffer的数量是48:

***************************************************************************

CHECKPOINT PROGRESS RECORDS

***************************************************************************

(size = 8180, compat size = 8180, section max = 11, section in-use = 0,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 2, numrecs = 11)

THREAD #1 - status:0x2 flags:0x0 dirty:48

low cache rba:(0x27.6c.0) on disk rba:(0x27.f9.0)

on disk scn: 0x0000.001195a5 09/10/2010 14:55:25

resetlogs scn: 0x0000.00089c75 07/31/2010 16:35:52

heartbeat: 729376761 mount id: 570757625

把这里的RBA信息简单分析一下:

在启动数据库时,进行恢复产生了一个跟踪文件,记录了恢复的过程,恢复从39号日志文件的第108块恢复至249块,正是以上数据库关闭之前的RBA地址范围:

*** SESSION ID:(158.4) 2010-09-10 14:56:11.738

Successfully allocated 2 recovery slaves

Using 545 overflow buffers per recovery slave

Thread 1 checkpoint: logseq 39, block 2, scn 1152089

cache-low rba: logseq 39, block 108

on-disk rba: logseq 39, block 249, scn 1152421

start recovery at logseq 39, block 108, scn 0

----- Redo read statistics for thread 1 -----

Read rate (ASYNC): 70Kb in 0.20s => 0.34 Mb/sec

Total physical reads: 4096Kb

Longest record: 8Kb, moves: 0/243 (0%)

Change moves: 2/29 (6%), moved: 0Mb

Longest LWN: 53Kb, moves: 0/6 (0%), moved: 0Mb

Last redo scn: 0x0000.001195a4 (1152420)

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

数据库恢复的检查点起点是SCN 1152089,也就是控制文件中记录的数据库最后完成的检查点,On-Disk RBA的SCN是1152421,转换为16进制也就是1195A5,也和控制文件中记录的On Disk SCN完全相符。

数据库的恢复SCN范围也就由此确定,即SCN范围:1152089~1152241。

启动数据库之后,查询一下日志信息,可以看到39号日志文件正是执行恢复的日志文件,其SCN范围处于1152088和1172422之间,一个日志就满足了之前恢复的SCN范围,恢复完成之后日志切换,当前使用了40号日志:

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME

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

1 1 40 52428800 1 NO CURRENT 1172422 10-SEP-10

2 1 38 52428800 1 NO INACTIVE 1131823 10-SEP-10

3 1 39 52428800 1 NO INACTIVE 1152088 10-SEP-10

至此我们清晰地看到了数据库恢复从Low Cache RBA至On Disk RBA的过程。

oracle数据库创建检查点,Oracle数据库通过检查点和RBA信息确定恢复范围相关推荐

  1. oracle+手工创建pfile,oracle 手工创建数据库

    1, 创建pfile,通cat命令将以#和空格开头的行过滤掉,放到initSID.ora文件中 pfile文件格式为init(sid).ora cd $ORACLE_HOME/dbs cat init ...

  2. sybase 数据导入mysql_Windows环境下Sybase12.5 数据库创建与导入数据库.docx

    Windows环境下Sybase12.5 数据库创建与导入数据库?? 现在的情况是,Sybase数据库已经安装完成了,需重新创建一个叫ptms的数据库,指定一个用户名sybase/sybase,具备全 ...

  3. ORACLE DATAGUARD 数据库---创建逻辑备用数据库

    本文描述如何创建一个逻辑备用数据库,包括以下主题: 创建逻辑备用数据库的准备工作 创建逻辑备用数据库 更多的准备 1.创建逻辑备用数据库的准备工作 在你创建备用数据库之前,你需要首先确保主数据库的配置 ...

  4. Oracle DBlink创建访问远程数据库

    一.使用场景 当要夸服务器访问数据库时,我们可以使用dblink建立连接服务器间的通道,本地创建了远程数据库的dblink后,访问远程服务器的库就像操作一个库一样了. 二.查看已创建的DBlink S ...

  5. oracle可以创建多个数据库实例吗_oracle 一个实例下可以建多个数据库么?

    oracle 如何在一个数据库创建多个实例 首先"创建数据库的时候起不同的名字"不是一个数据库对应多个实例,概念不清~ 如果就你的问题来看,你可以查阅关于Oracle rac 的信 ...

  6. oracle之创建和管理数据库用户账户

    创建和管理数据库用户账户 sys 查看数据库里有多少用户? select username from dba_users; 9.1.1用户的缺省表空间 每个用户账户都可以指定默认的表空间,用户创建的任 ...

  7. oracle中创建游标,oracle 存储过程创建游标

    Oracle与Sql Server差异点详解 1.create函数或存储过程异同点 Oracle 创建函数或存储过程一般是 create or replace -- SQL SERVER 则是在创建之 ...

  8. oracle常用创建模式,ORACLE 常用操作命令

    1.1导出 1.2导出使用程序有以下常用的命令参数参数                           说明 USERID           确定执行导出实用程序的用户名和口令 BUFFER   ...

  9. oracle批量创建序列号,Oracle数据库中创建并利用序列号生成ID

    已经有了序列后,怎么样自动生成ID? 其实是用一条包含序列号的sql语句从dual表中查出的id再赋值给id 以下举两条实战的sql: select '00010222' ||  lpad(seq_s ...

  10. oracle数据库创建user,Oracle数据库如何创建数据库用户呢?

    摘要: 下文讲述Oracle数据库中创建数据库用户的方法分享,如下所示: 在oracle数据库中,当我们创建了相应的数据库后,通常我们会为数据库指定相应的用户,然后单独操作此数据库, 下文讲述orac ...

最新文章

  1. 《Windows Server 2012 Hyper-V虚拟化管理实践》——1.3 物理服务器选型建议
  2. linux 服务搭建DNS
  3. win10 输入法不见了、繁体 问题解决
  4. 【在还原SQL Server数据库时发生对于服务器“XXX”操作系统错误】很实用的解决方案...
  5. [原创软件测试工作技能
  6. 驱动华为_实锤!华为成立驱动芯片部门,OLED驱动芯片正流片
  7. 114. Flatten Binary Tree to Linked List 二叉树展开为链表
  8. python字符串之join
  9. Scala中zip或者zipWithIndex的计数器用法
  10. python做股票分析_利用Python进行股票投资组合分析(调试)
  11. golang实现聊天室(五)
  12. JavaScript:constructor属性
  13. android responsebody转json_SpringBoot 项目开发是如何返回 json 数据以及数据封装
  14. 华为交换机 查ip冲突_华为交换机:如何解决网络中IP地址发生冲突故障?
  15. [简单]1.宝石和石头
  16. jQuery基础之事件
  17. UI——PS色彩搭配
  18. 谷歌浏览器无法登录账号
  19. ElasticSearch 多字段分组求和
  20. 【毕设狗】【单片机毕业设计】基于单片机的交通红绿灯控制系统的设计

热门文章

  1. linux的mysql不允许连接_linux下允许mysql远程连接
  2. C# WPF中DataGrid的数据绑定(Binding)
  3. Day 45 Ansible批量管理
  4. Lambda表达式妙用
  5. 配置zabbix当内存剩余不足10%的时候触发报警
  6. mybatis同时查询未知个数的表中数据(表名做为参数传递,联合查询union)
  7. String:基本实现
  8. 此内容不能显示在一个框架中_.NET开发框架(二)框架功能简述
  9. OpenCV-图像处理(10、膨胀与腐蚀)
  10. python中sample()函数_PandasDataframe.sample()使用介绍