Loading
1

一起无controlfile恢复数据库案列

昨天帮一个朋友解决了一个问题,他的数据库在用rman做了一次copy备份后,做了N次不完全恢复,resetlogs 了N次,那之后他又用Rman做了一次copy备份,结果当他想再恢复到第一次的copy备份时,却报错无法切换,据他说那个是他们公司的生产数据,已经停了一天不能用了,真是汗啊。

处理过程

首先由于他在想切换到第一次copy时并没有恢复控制文件,所以当时他报了类似以下错误:

 控制文件或者数据文件1是来自最后一次resetlogs之前的,他用的copy是在resetlogs之前的,而他没有恢复当时的controlfile,所以不匹配无法切换,

其实当时首先想到的一个思路就是既然没有可用的controlfile,那么就当控制文件丢失处理,它有当时备份的copy,只要重建控制文件,然后重置日志打开数据库应该就没问题,但由于当时有点沟通不畅,来来回回尝试了几次不同的方式浪费了不少时间,我将我写的控制文件创建脚本发给了他,让他把相关文件的路径和大小根据它的实际情况修改执行,结果却报了个莫名其妙的错误,说logfile子句里的size选项是一个无效的选项,实在郁闷不已。以下是在我数据库上生成出来的创建控制文件的语句:

 生成控制文件创建脚本的语句如下:

 这个语句会在你的dump目录下生成一个trc文件,10g是在udump目录,11g是在trace目录,这个文件中有类似如下内容:

 这个文件中有两个脚本,分别是应对noresetlogs和resetlogs的,如果你在重建控制文件后还有继续使用redo和归档recovery,那么使用noresetlogs的脚本创建,如果你不需要恢复,只需要那个备份不需要前滚,那么使用resetlogs的脚本创建控制文件,然后resetlogs打开数据库即可。

我将我生成的控制文件创建脚本给了他,让他按照自己的情况修改文件路径和大小,他修改完后的脚本如下:

 这个的size大小错了,我的日志大小是2Gb,他其实只有50M,但在修改完正确的值之后,执行脚本依然报如下错误:

 这个脚本式我机器上生成出来的,理论上是应该不会有错的,查看了联机文档后没有发现BLOCKSIZE这个参数的示例,猜想是否是这个参数的问题,于是去掉了这个参数,但依旧报错:

 很无奈啊,由于时间问题,晚上我约了人吃饭,所以就约好晚上10点之后如果他依然没有解决我再帮他看看。

在吃饭的时候我一直在纠结这个问题,酒足饭饱之后,脑子也清晰了许多,他只要那个copy的数据,其他都不需要做恢复,只要重建了控制文件打开就行,创建控制文件的脚本是数据库自动创建的,这个应该是不会错的,有一种可能就是他的数据库跟我的数据库的版本不同,所以会产生差异,但其实也不是,这个是在解决之后整理这个案例时才发现的错误,并不是版本不同造成的语法错误,而是当时他由于是修改了我给他的脚本,我的脚本中日志有5组,而他的日志为3组,他直接把我后面两组给删除了,但是他没有删除最后一组那里的一个“,”,最后一组是不能有逗号的,所以这是一个语法错误,而在当时由于要下班了,有一个饭局等着,并且他在QQ上发给我看,输出了一大堆的东西,我也只是粗略的看了一下,忽略了那个逗号的问题,结果一个问题绕了好久,浪费了很多时间。

回家上QQ,问他是否将此问题解决了,他说他跟另一个人还在研究这个问题,没有解决,他发现他设置了控制文件自动备份,他从自动备份中恢复了控制文件,但是恢复之后发现数据不对,少了一个月的数据,围绕着用哪个控制文件的问题又耗了不少时间,尝试下来依旧有问题,于是我继续坚定我的想法,重建控制文件,使用第一次的copy作为可用数据,这次我让他在他的数据库上创建控制文件重建脚本,以下是在他数据库中创建自动生成的控制文件重建脚本:

 使用这个脚本他成功重建了控制文件,然后根据数据库生成的trace文件中对resetlogs重建controlfile案例的操作步骤执行以下命令:

 提示说数据库需要一些之后的归档来恢复,但我们不需要恢复这些归档,我们只要恢复到那个copy就行,所以我们要输入CANCEL,然后通过resetlogs打开数据库看能否成功:

 很显然,他的数据库成功打开了,询问他要的数据是否都在,他查询对比后发现他要的数据都在,这次数据恢复总算告一段落圆满解决。

问题总结:尽量做好完备的备份恢复机制,虽然这个系统只是公司内部的一个小系统,也没什么量,但是出了问题还是很麻烦的一件事,在有完备备份的情况下使用通常的步骤按部就班的恢复,如果这种控制文件不确定或丢失,但数据文件都存在,就直接重建控制文件进行恢复即可,还有就是细节问题,一个小小的逗号都有可能把你折腾死,本应该很快解决的问题却因为一个逗号绕了一大圈,细节决定成败啊。

 

请尊重我们的辛苦付出,未经允许,请不要转载 Ask600 的文章!