Oracle实例恢复原理

       首先从事物说起,当执行update开启一个事物的时候,首先需要在buffer cache中找到可用的块(block)更新数据,然后构造cr块,将update之前的数据放入到undo中,同时会在log buffer内写日志,log buffer内数据每隔3秒通过lgwr进程将往redo log写日志,在这个过程更改的数据还在内存中,产生脏数据,直到dbwr进程将脏数据写入到磁盘,如果脏数据还未写入磁盘,脏数据中包括提交或未提交的,这个时候由于掉掉或其他原因导致数据库意外宕机,主机恢复后重启数据库,Oracle会由SMON进程自动进行实例恢复为什么会发生实例恢复,这得提到oracle的SCN,在oracle中存在4个scn,system SCN,datafile SCN,结束SCN和datafile header SCN,在Oracle正常关闭的情况下,数据库会产生完全检查点,会通过DBWR进程将脏块写到磁盘,更新着4个SCN值相同,在非正常关闭的情况下,当数据库启动到mount状态时,oracle会发现last scn并不是等于其它3个SCN, 而是等于NULL,这表示Oracle在shutdown时没有进行checkpoint,下次开机必须进行crash recovery(实例恢复)。oracle的SCN什么时候会发生变化,上述在log buffer内写日志的时候,会产生增量检查点,增量检查点并不会去更新数据文件头,以及控制文件中数据库SCN以及数据文件条目的SCN信息,而只是每3秒由CKPT进程去更新控制文件中的low cache rba信息(RBA含义redo block adress),也就是检查点的位置。系统SCN、数据文件SCN、数据文件头部SCN的值真正发生变化的时候是在redo文件由ACTIVE变为INACTIVE时,才会更新,这3个值等于ACTIVE, CURRENT中最老的一个日志文件的头部的first SCN,(redo日志文件各状态解释:CURRENT表示当前正在使用的日志文件,ACTIVE表示日志文件中对应的脏块还没有写到磁盘中,而INACTIVE则表示日志文件中对应的所有脏块都写到了磁盘)Oracle实例恢复的起点与终点,以实验为例说明:

1、首先在测试数据库创建测试数据提交,在buffer cache产生脏块
create table test(id number,name varchar2(22))

insert into test values(1,'hh')
commit

2、做一次控制文件转储
SQL> alter session set events 'immediate trace name controlf level 12';

Session altered.

3、非正常关闭数据库
shutdown abort

4、启动数据库,做一次控制文件转储
SQL> alter session set events 'immediate trace name controlf level 12';

Session altered.

5,检查对比两次转储文件内容
第一次转储信息:
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)
04/06/2017 23:27:11
DB Name "TSS"
Database flags = 0x50404001 0x00001200
Controlfile Creation Timestamp 04/06/2017 23:27:11
Incmplt recovery scn: 0x0000.00000000
Resetlogs scn: 0x0000.00000001 Resetlogs Timestamp 04/06/2017 23:27:11
Prior resetlogs scn: 0x0000.00000000 Prior resetlogs Timestamp 01/01/1988 00:00:00
Redo Version: compatible=0xb200400
#Data files = 8, #Online files = 8
Database checkpoint: Thread=1 scn: 0x0000.0022eb8b
Threads: #Enabled=1, #Open=1, Head=1, Tail=1

可知这时数据库的检查点scn: 0x0000.0022eb8b,转化为10进制:2288523
SQL> select to_number('22eb8b','XXXXXXXX') from dual;

TO_NUMBER('22EB8B','XXXXXXXX')

           2288523

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:65
low cache rba:(0x76.ab2.0) on disk rba:(0x76.b43.0)
on disk scn: 0x0000.0022f1cd 10/27/2017 15:17:00
resetlogs scn: 0x0000.00000001 04/06/2017 23:27:11
heartbeat: 958525302 mount id: 2083188020

检查点进程信息记录了low cache rba及on disk rba的值
low cache rba含义解释:0x76表示sequence号,ab2表示块号,on disk rba内值含义相同

所以此时low cache rba对应的sequence为118 ,block号为2738,on disk rba对应的sequence为118 ,block号为2883

数据库启动后转储的控制文件信息
* 2017-10-27 15:18:08.577
* SESSION ID:(16.3) 2017-10-27 15:18:08.577
* CLIENT ID:() 2017-10-27 15:18:08.577
* SERVICE NAME:() 2017-10-27 15:18:08.577
* MODULE NAME:(sqlplus@single (TNS V1-V3)) 2017-10-27 15:18:08.577
* ACTION NAME:() 2017-10-27 15:18:08.577

Thread 1 checkpoint: logseq 118, block 2, scn 2288523
cache-low rba: logseq 118, block 2738

on-disk rba: logseq 118, block 2884, scn 2290131

start recovery at logseq 118, block 2738, scn 0

数据库的alert信息
ALTER DATABASE OPEN
Beginning crash recovery of 1 threads
Started redo scan
Completed redo scan
read 73 KB redo, 65 data blocks need recovery
**Started redo application at
Thread 1: logseq 118, block 2738**
Recovery of Online Redo Log: Thread 1 Group 1 Seq 118 Reading mem 0
Mem# 0: /home/oracle/oradata/tss/redo01.log
Completed redo application of 0.05MB
**Completed crash recovery at
Thread 1: logseq 118, block 2884, scn 2310131**
65 data blocks read, 65 data blocks written, 73 redo k-bytes read
LGWR: STARTING ARCH PROCESSES
Fri Oct 27 15:18:08 2017
ARC0 started with pid=18, OS id=2400
ARC0: Archival started
LGWR: STARTING ARCH PROCESSES COMPLETE
ARC0: STARTING ARCH PROCESSES
Fri Oct 27 15:18:09 2017
ARC1 started with pid=19, OS id=2402
Thread 1 advanced to log sequence 119 (thread open)
Fri Oct 27 15:18:09 2017
ARC2 started with pid=20, OS id=2404
Thread 1 opened at log sequence 119
Current log# 2 seq# 119 mem# 0: /home/oracle/oradata/tss/redo02.log
Successful open of redo thread 1
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
SMON: enabling cache recovery
ARC1: Archival started
ARC2: Archival started
ARC1: Becoming the 'no FAL' ARCH
ARC1: Becoming the 'no SRL' ARCH
ARC2: Becoming the heartbeat ARCH
Fri Oct 27 15:18:09 2017
ARC3 started with pid=21, OS id=2406
Archived Log entry 98 added for thread 1 sequence 118 ID 0x7b19ed8f dest 1:
[2398] Successfully onlined Undo Tablespace 2.
Undo initialization finished serial:0 start:2048784 end:2048814 diff:30 (0 seconds)
Verifying file header compatibility for 11g tablespace encryption..
Verifying 11g file header compatibility for tablespace encryption completed
SMON: enabling tx recovery
Database Characterset is ZHS16GBK
No Resource Manager plan active
replication_dependency_tracking turned off (no async multimaster replication found)
Starting background process QMNC
Fri Oct 27 15:18:10 2017
QMNC started with pid=22, OS id=2408
ARC3: Archival started
ARC0: STARTING ARCH PROCESSES COMPLETE
Completed: ALTER DATABASE OPEN
Fri Oct 27 15:28:10 2017
Starting background process SMCO
Fri Oct 27 15:28:10 2017
SMCO started with pid=26, OS id=2509

     从上述alert log我们可以知道,Oracle做Instance Recovery的起点是logseq 118, block 2738;终点是logseq 118, block 2884从第一次控制文件的dump文件我们可以看到控制文件里记录的Low Cache RBA是(0x76.ab2.0,转换过来就是Low Cache RBA的logfile sequence是118,logfile block number是2738。”这和alert log里记录的Instance Recovery的起点一致,即Instance Recovery的起点就是Low Cache RBA;数据库启动后控制文件的dump文件信息记录的on-disk rba的 logseq 118, block 2884,与alert日志Completed crash recovery恢复记录的logseq 118, block 2884一致,即Instance Recovery的终点就是on-disk rba

Oracle实例恢复相关推荐

  1. Oracle 实例恢复--转自沙弥的世界

    --======================= -- Oracle 实例恢复 --======================= 一.Oracle实例失败 Oracle实例失败多为实例非一致性关闭 ...

  2. Oracle 实例恢复时 前滚(roll forward) 后滚(roll back) 问题

    在ITPUB 论坛上看到一个有关实例恢复时 前滚(roll forword)和回滚(roll back)的讨论.在这里小整理一下,也理理自己的一个思路. 一. 什么时候需要实例恢复 在shutdown ...

  3. Oracle 实例恢复时 前滚(roll forward) 后滚(roll back) 问题

    在ITPUB 论坛上看到一个有关实例恢复时 前滚(roll forword)和回滚(roll back)的讨论.在这里小整理一下,也理理自己的一个思路. 一. 什么时候需要实例恢复 在shutdown ...

  4. oracle实例恢复 redo,ORACLE不完全恢复之current或active状态redo损坏(二)

    完全恢复:是指介质恢复阶段(即执行recover命令时)必须应用所有的应该应用的重做记录:它们包括从数据文件头中的检查点RBA所指向的重做记录开始,一直到在线的当前的重做日志的最新一条 记录结束,不论 ...

  5. 实例恢复(Instance Recovery)之前滚(Rolling Forward)和回滚(Rolling Back)

    Oracle实例恢复(Instance Recovery)之前滚(Rolling Forward)和回滚(Rolling Back) 关于oracle实例恢复的一些理解,一直都有误区,今天通过查看相关 ...

  6. Oracle技术之实例恢复的顺序

    通过alert仔细观查,发现实例恢复的顺序是: 1.前滚 2.open db 3.rollback(注意:SMON: Parallel transaction recovery tried 在Comp ...

  7. oracle的故障包括用户或应用程序故障_数据库实例错误,oracle 备份恢复基础

    一,与基础 1.,备份简介 备份是数据的一个副本,一般包括控制文件和数据文件等 物理备份与逻辑备份 物理备份指物理文件的副本,逻辑备份是指使用工具抽取逻辑数据(例如,表或存储过程)并保存在二进制文件中 ...

  8. 将oracle冷备份恢复到另外一个数据库实例中

    因更换服务器需要将Oracle数据库转移到另外台Oracle中. 说明: 1.测试环境为:windows server2003 和 oracle 10g. 2.2台服务器安装的程序目录一样,数据目录不 ...

  9. Oracle 实例崩溃恢复原理剖析 -- 检查点队列的作用与意义

    这篇文章是参考甲骨论老相老师的教学视频 http://v.youku.com/v_show/id_XNDAxMzI3NzI4.html 所做的学习笔记 检查点队列的内容已经在上一篇文章里讲过: htt ...

  10. ora-01092: oracle 实例终止.强制断开连接,undo表空间故障特殊恢复(二)------ORA-01092: ORACLE 实例终止。强制断开连接...

    原文出处:http://blog.csdn.net/wyzxg/archive/2010/09/10/5874726.aspx undo表空间故障特殊恢复(二)------ORA-01092: ORA ...

最新文章

  1. 搭完环境,最后登录时提示“与数据库连接失败,请与管理员联系”
  2. java 泛型接口 范型类 范型方法_泛型类、泛型方法、泛型接口
  3. 富文本编辑器中空格转化为a_如何对富文本编辑器(FCK Html Editor)的工具栏进行扩展?...
  4. mysql unicode转汉字_Mysql数据库表引擎与字符集
  5. 【thymeleaf 】在 thymeleaf 中使用 shiro 标签
  6. 银华基金:用小型机的群狼战术保驾护航!
  7. 5门可能衰落的编程语言
  8. scala中map添加值_如何在Scala Map中反转键和值
  9. mysql2008无法登陆_SQL2008不能登录实例
  10. 前端:JS/20/数组(数组的概念,数组元素,数组索引,数组元素的访问,数组的长度,数组的创建方法,数组的操作,实例:使用数组保存个人信息,实例:求数组所有值的平均值,数组对象的length属性)
  11. 供应商主数据和客户主数据各个字段进行显示、必输、隐藏和可选输入的配置学习...
  12. 算法与数据结构 第3章 高级排序算法中 归并算法改进
  13. bios开发 c语言,BIOS开发环境
  14. c语言标识符的语法规定,C语言语法规则.doc
  15. 小米笔记安装双系统linux,小米笔记本电脑怎么安装双系统?-小米win7
  16. 为flash游戏终极实用提速
  17. 硬改TP-WR886N v5 路由器刷入源码编译的openWRT/LEDE系统
  18. 零基础入门CV赛事- 街景字符编码识别
  19. PRN(20210426):Online Continual Learning with Maximally Interfered Retrieval
  20. Java jdk14.0.1安装简单步骤

热门文章

  1. MFC---CComboBox控件添加字符串函数InsertString
  2. 边缘计算与嵌入式系统
  3. MATLAB中SVM(支持向量机)的用法
  4. Machine Learning——Homework 7
  5. 二维数组,字符串,字符数组
  6. Python 3 实现插入排序
  7. mysql中in的问题
  8. 乐高积木格斗机器人组装拼图_玩积木、组装机器人的多重好处,你一定想不到!(认识机器人)...
  9. android 子线程的网络请求为什么还会造成界面卡顿_京东数科mPaaS:深度解读京东金融App(Android)的秒开优化实践...
  10. zookeeper 限制本机ip访问_解Bug之路-dubbo应用无法重连zookeeper