文档章节

oracle的resetlogs机制浅析

 突突突酱
发布于 2018/10/17 17:12
字数 1201
阅读 3
收藏 0

oracleresetlogs机制浅析

alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用?
它的原理机制是什么?他都起哪些作用?

我们都知道数据在启动时候是要做一致性检查的,oracle在open阶段要做两次检查

1. 检查数据文件头的检查点计数(checkpoint cnt)是否和控制文件的检查点计数(checkpoint cnt)一致。目的是确认数据文件
是否来自同一版本,而不是从备份中恢复的。如果这一步检查通过,就进行第二步检查

2. 检查数据文件头的开始scn和控制文件中记录该文件的结束scn是否一致。如果数据文件头的开始scn和控制文件中该文件的结束scn
相等,那说明这个数据文件就不需要恢复,否则就要恢复文件

如果以上两步检查都通过,那就可以正常打开数据库,锁定数据文件,同时将控制文件中每个数据文件的结束scn设置无穷大。
我们在某些条件下打开数据,会提示让用resetlogs选项open数据库,为什么要用resetlogs呢?它是干嘛用的呢?问号一大堆了吧,
下面来具体分析下。

resetlogs的作用

防止陈旧的数据进入数据库(保证数据库的一致性),这也就是为什么在用resetlogs打开数据库,一定要立即对数据库做个全备。
在控制文件,data file header,redo log header里存储”resetlogs data“,当open resetlogs被执行时,可以通过这些内容检查一致性。

什么时候用resetlogs

1. 不完全恢复
2. 用备份的控制文件恢复
3. 新创建的控制文件来恢复

resetlogs的原理机制

resetlogs是如何来保证打开数据库是一致的呢?

1)在open resetlogs时,oracle要对比检查控制文件和数据字典file$,如果一个数据文件在file$中存在,但在控制文件中不存在,
那在控制文件中将创建一个这个文件条目(MISSINGnnn ‘nnn’是十进制的file_id),同时这个文件被标记为离线并需要恢复。如果
实际中这个文件存在的话,可以通过如下sql更改到正确的文件名。

sql> alter database rename file 'MISSINGnnn' to '<filename>';

然后数据文件被恢复,online。

2)如果一个数据文件存在控制文件中,而不在数据字典file$中,那么直接把控制文件中这个文件的记录条目删除(oracle认为file$文
件是正确的,要以它为准)

3)当用旧的备份控制文件恢复的时候,如果有数据文件不在控制文件中注册(会提示控制文件比较旧的错误),那就不得不重建数据文件
,以使数据文件注册到控制文件中,然后系统会自动利用redo/archivelog恢复这个数据文件。

在保证控制文件和file$文件内容一致之后,oracle还有做如下检查才能open resetlogs

4)数据文件的版本要小于当前数据库的版本(counter)

5)offline的数据文件必须被online或者直接drop

6)所有的数据文件不能设置fuzzy bit,所有的数据文件要有相同的检查点(checkpoint SCN

到目前为止,open resetlogs的前提条件都已经满足,resetlogs究竟做了哪些工作呢?(重新使用redo log

1)所有的online logfile 的信息重新被放置在控制文件中。并且还要为有效的thread挑选一个logfile文件作为current logfile

2)log header被更新为log seq#

3)所有的online的数据文件头被新的checkpoint和新的‘resetlogs data’更新,offline的数据文件被标记为需要媒体恢复。

resetlogs data:当前的scn和counter被称作”resetlogs data“

如果oracle数据库一致性检查失败的,那数据库是不允许被open的,即 open resetlogs不成功。但也不是绝对不能open,可以通过隐含参数“_allow_resetlogs_curruption”,绕过oracle的一致性检查,但这样会引起数据库的不一致(文件可能有不同的scn或有fuzzy bit设置),如果open后,数据库一定要rebuild (建议ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;或者imp/exp )

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 54
码字总数 57569
作品 0
私信 提问
使用Oracle10g新特性,跨越Resetlogs时间点进行恢复

在Oracle10g以前,在进行了不完全恢复使用resetlogs选项打开数据库以后,Oracle建议你要立即进行全备份。 因为日志序号会被置位,以防止后续日志被应用。resetlogs之前的备份将不能用于进行跨...

郑加威
2017/02/08
0
0
RMAN备份FORMAT格式中%a的含义

oracle文档对%a的描述是: rman备份并保存,查询%a 由此,可知%a为:790774120 查询x$kccdi 由此,可知%a便是DIRLC_I 查询v$database_incarnation 由此,可知%a、resetlogs_id和dirlc_i,此三...

长平狐
2012/09/19
31
0
Oracle的闪回特性之恢复truncate删除表的数据

/ 2008/06/06 环境:Windows XP +Oracle10.2.0.1 循序渐进oracle——数据库管理、优化与备份恢复 循序渐进oracle第8章:Oracle的闪回特性之恢复truncate删除表的数据 / SQL> show parameter ...

Super康
2017/09/18
0
0
使用_allow_resetlogs_corruption打开无归档日志rman备份库

使用allowresetlogs_corruption打开无归档日志rman备份库 rman还原恢复操作 --还原数据库 RMAN> restore database; --恢复数据库 RMAN> recover database; Starting recover at 2012-03-08 2......

我就叫你女王吧
2016/06/02
12
0
recover database 和 recover database using backup controlfile

原文 http://hi.baidu.com/james_yulei/blog/item/2b16863a2cefdbcfd4622563.html recover database : 在普通的recover database 或者 recover tablespace, recover datafile时,Oracle会以......

晨曦之光
2012/04/25
147
0

没有更多内容

加载失败,请刷新页面

加载更多

智能合约漏洞 -- 默认可见性修饰符

Solidity函数有visibility指定符,标明函数如何被允许访问。Visibility决定一个函数是否能被用户,被其他派生合约,从外部调用,仅从内部调用等等。有4个visibility指定符.函数默认的visibil...

怎当她临去时秋波那一转
46分钟前
1
0
Guava学习之Splitter 管道符分割

String str = "11|"; //方式一 分割 List<String> strs = Splitter.on("|").splitToList(str); //方式二分割 String[] strs2 = str.split("\\|"); ......

qimh
今天
5
0
flutter 保存视频 立即刷新

保存目录问题 String savePath= path.join(await _findLocalPath(),"DCIM","Camera"); 我的是小米8 这里面没有用到通知功能,也能够直接显示出来。 参考文章:https://blog.csdn.net/cod......

大灰狼wow
今天
2
0
MongoDB

关于MongoDb 1、MongoDB是一个开源的、基于分布式的、面向文档存储的非关系型数据库。 2、是非关系型数据库当中功能最丰富、最像关系数据库的。 3、由C++编写, MongoDB可以运行在Windows、u...

谢思华
今天
7
0
Node.js 进程平滑离场剖析

本文由云+社区发表 作者:草小灰 使用 Node.js 搭建 HTTP Server 已是司空见惯的事。在生产环境中,Node 进程平滑重启直接关系到服务的可靠性,它的重要性不容我们忽视。既然是平滑重启,就涉...

腾讯云加社区
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部