朋友客户的数据库由于磁盘损坏,从存储级别抽取出了RMAN的备份文件,但没有抽取出数据文件,联机重做日志,控制文件,参数文件等数据库文件。但抽取出来的备份文件中有数据文件,控制文件,参数文件的备份,归档重做日志备份因为没有磁盘空间没有执行完成。新安装Oracle软件后创建参数文件来使用RMAN备份来还原和恢复数据库。但在还原数据文件时出错,错误如下所示:
RMAN> run
2> {
3> allocate channel t1 device type disk;
4> restore controlfile from 'E:\ORABACK\ORCLBPM_9BQ7K30M_20150522.BAK';
5> alter database mount;
6> release channel t1;
7> }
使用目标数据库控制文件替代恢复目录
分配的通道: t1
通道 t1: SID=572 设备类型=DISK
启动 restore 于 29-5月 -15
通道 t1: 正在还原控制文件
通道 t1: 还原完成, 用时: 00:00:03
输出文件名=D:\ORACLE\ORADATA\ORCLBPM\CONTROL01.CTL
输出文件名=D:\ORACLE\ORADATA\ORCLBPM\CONTROL02.CTL
输出文件名=D:\ORACLE\ORADATA\ORCLBPM\CONTROL03.CTL
完成 restore 于 29-5月 -15
数据库已装载
释放的通道: t1
RMAN> run
2> {
3> allocate channel t1 device type disk;
4> restore database;
5> recover database;
6> release channel t1;
7> }
分配的通道: t1
通道 t1: SID=572 设备类型=DISK
启动 restore 于 29-5月 -15
启动 implicit crosscheck backup 于 29-5月 -15
已交叉检验的 200 对象
完成 implicit crosscheck backup 于 29-5月 -15
启动 implicit crosscheck copy 于 29-5月 -15
完成 implicit crosscheck copy 于 29-5月 -15
搜索恢复区中的所有文件
正在编制文件目录...
没有为文件编制目录
通道 t1: 正在开始还原数据文件备份集
通道 t1: 正在指定从备份集还原的数据文件
通道 t1: 将数据文件 00001 还原到 D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF
通道 t1: 将数据文件 00002 还原到 D:\ORACLE\ORADATA\ORCLBPM\SYSAUX01.DBF
通道 t1: 将数据文件 00003 还原到 D:\ORACLE\ORADATA\ORCLBPM\UNDOTBS01.DBF
通道 t1: 将数据文件 00004 还原到 D:\ORACLE\ORADATA\ORCLBPM\USERS01.DBF
通道 t1: 将数据文件 00005 还原到 D:\ORACLE\ORADATA\ORCLBPM\HB_SY01.DBF
通道 t1: 将数据文件 00006 还原到 D:\ORACLE\ORADATA\ORCLBPM\HB_SY02.DBF
通道 t1: 将数据文件 00007 还原到 D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF
通道 t1: 将数据文件 00008 还原到 D:\ORACLE\ORADATA\ORCLBPM\BPMSY01.DBF
通道 t1: 将数据文件 00009 还原到 D:\ORACLE\ORADATA\ORCLBPM\HMBPM01.DBF
通道 t1: 将数据文件 00010 还原到 D:\ORACLE\ORADATA\ORCLBPM\BLOCK01.DBF
通道 t1: 正在读取备份片段 E:\ORABACK\ORCLBPM_9AQ7K1NM_20150522.BAK
通道 t1: ORA-19870: 还原备份片段 E:\ORABACK\ORCLBPM_9AQ7K1NM_20150522.BAK 时出错
ORA-19612: 数据文件 1 没有还原, 因为 missing or corrupt data
故障转移到上一个备份
释放的通道: t1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: restore 命令 (在 05/29/2015 17:03:44 上) 失败
RMAN-06026: 有些目标没有找到 - 终止还原
RMAN-06023: 没有找到数据文件1的副本来还原
从错误信息: ORA-19870: 还原备份片段 E:\ORABACK\ORCLBPM_9AQ7K1NM_20150522.BAK 时出错,ORA-19612: 数据文件 1 没有还原, 因为 missing or corrupt data可以知道在执行还原数据文件1时备份片段丢失或有坏块,这里明显是有坏块,因为其它数据文件使用该备份片段已经还原成功了。这里通过设置事件让RMAN跳过坏块来还原数据文件。
C:\Users\Administrator>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期五 5月 29 18:02:22 2015
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> alter system set event=’19548 trace name context forever’, ‘19549 trace name
context forever’ scope=spfile;
系统已更改。
SQL> shutdown immediate
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 7666352128 bytes
Fixed Size 2190736 bytes
Variable Size 3942646384 bytes
Database Buffers 3707764736 bytes
Redo Buffers 13750272 bytes
数据库装载完毕。
RMAN> restore database;
启动 restore 于 29-5月 -15
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=1141 设备类型=DISK
正在略过数据文件 2; 已还原到文件 D:\ORACLE\ORADATA\ORCLBPM\SYSAUX01.DBF
正在略过数据文件 3; 已还原到文件 D:\ORACLE\ORADATA\ORCLBPM\UNDOTBS01.DBF
正在略过数据文件 4; 已还原到文件 D:\ORACLE\ORADATA\ORCLBPM\USERS01.DBF
正在略过数据文件 5; 已还原到文件 D:\ORACLE\ORADATA\ORCLBPM\HB_SY01.DBF
正在略过数据文件 6; 已还原到文件 D:\ORACLE\ORADATA\ORCLBPM\HB_SY02.DBF
正在略过数据文件 8; 已还原到文件 D:\ORACLE\ORADATA\ORCLBPM\BPMSY01.DBF
正在略过数据文件 9; 已还原到文件 D:\ORACLE\ORADATA\ORCLBPM\HMBPM01.DBF
正在略过数据文件 10; 已还原到文件 D:\ORACLE\ORADATA\ORCLBPM\BLOCK01.DBF
通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00001 还原到 D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF
通道 ORA_DISK_1: 将数据文件 00007 还原到 D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF
通道 ORA_DISK_1: 正在读取备份片段 E:\ORABACK\ORCLBPM_9AQ7K1NM_20150522.BAK
通道 ORA_DISK_1: 段句柄 = E:\ORABACK\ORCLBPM_9AQ7K1NM_20150522.BAK 标记 = TAG2015052
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:02:45
完成 restore 于 29-5月 -15
下面对之前还原报错的数据文件SYSTEM01.DBF,HB_SY03.DBF进行验证
C:\Users\Administrator>dbv file=D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF blocksize
=8192
DBVERIFY: Release 11.2.0.1.0 – Production on 星期五 5月 29 18:29:19 2015
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
DBVERIFY – 开始验证: FILE = D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF
DBVERIFY – 验证完成
检查的页总数: 280064
处理的页总数 (数据): 242009
失败的页总数 (数据): 0
处理的页总数 (索引): 13233
失败的页总数 (索引): 0
处理的页总数 (其他): 3322
处理的总页数 (段) : 1
失败的总页数 (段) : 0
空的页总数: 21500
标记为损坏的总页数: 0
流入的页总数: 0
加密的总页数 : 0
最高块 SCN : 87501555 (0.87501555)
C:\Users\Administrator>dbv file=D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF blocksize=
8192
DBVERIFY: Release 11.2.0.1.0 – Production on 星期五 5月 29 18:30:35 2015
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
DBVERIFY – 开始验证: FILE = D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF
DBVERIFY – 验证完成
检查的页总数: 524288
处理的页总数 (数据): 256890
失败的页总数 (数据): 0
处理的页总数 (索引): 52837
失败的页总数 (索引): 0
处理的页总数 (其他): 196657
处理的总页数 (段) : 0
失败的总页数 (段) : 0
空的页总数: 17904
标记为损坏的总页数: 0
流入的页总数: 0
加密的总页数 : 0
最高块 SCN : 87500838 (0.87500838)
从上面的验证可以看到没有坏块,幸运哈哈。我们来检查一个控制文件中记录的数据文件检查点SCN与数据文件头SCN是否相同,如果不同可能需要恢复。
SQL> select file#,checkpoint_change#,to_char(checkpoint_time,'yyyy-mm-dd hh24:mi
:ss') checkpoint_time from v$datafile;
FILE# CHECKPOINT_CHANGE# CHECKPOINT_TIME
---------- ------------------ -------------------
1 87500284 2015-05-22 23:00:42
2 87500284 2015-05-22 23:00:42
3 87500284 2015-05-22 23:00:42
4 87500284 2015-05-22 23:00:42
5 87500284 2015-05-22 23:00:42
6 87500284 2015-05-22 23:00:42
7 87500284 2015-05-22 23:00:42
8 87500284 2015-05-22 23:00:42
9 87500284 2015-05-22 23:00:42
10 87500284 2015-05-22 23:00:42
已选择10行。
SQL> select file#,checkpoint_change#,name from v$datafile_header;
FILE# CHECKPOINT_CHANGE# NAME
---------- ------------------ ----------------------------------
1 87499953 D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF
2 87499953 D:\ORACLE\ORADATA\ORCLBPM\SYSAUX01.DBF
3 87499953 D:\ORACLE\ORADATA\ORCLBPM\UNDOTBS01.DBF
4 87499953 D:\ORACLE\ORADATA\ORCLBPM\USERS01.DBF
5 87499953 D:\ORACLE\ORADATA\ORCLBPM\HB_SY01.DBF
6 87499953 D:\ORACLE\ORADATA\ORCLBPM\HB_SY02.DBF
7 87499953 D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF
8 87499953 D:\ORACLE\ORADATA\ORCLBPM\BPMSY01.DBF
9 87499953 D:\ORACLE\ORADATA\ORCLBPM\HMBPM01.DBF
10 87499953 D:\ORACLE\ORADATA\ORCLBPM\BLOCK01.DBF
已选择10行。
可以看到所有数据文件头记录的检查点scn都一样,控制文件中记录的所有数据文件检查点scn都一样,但数据文件头检查点scn与控制文件中记录的数据文件检查点scn不一样,所以选择重建控制文件来执行恢复,这里将控制文件备份到跟踪文件中。
SQL> oradebug setmypid 已处理的语句 SQL> alter database backup controlfile to trace 2 ; 数据库已更改。 SQL> oradebug tracefile_name d:\app\administrator\diag\rdbms\orclbpm\orclbpm\trace\orclbpm_ora_1704.trc
下面用跟踪文件的控制文件创建语句来重新创建控制文件,这里要使用resetlogs方式来创建,因为RMAN的备份文件中没有联机重做日志文件。
SQL> shutdown immediate ORA-01109: ?????? 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> startup nomount ORACLE 例程已经启动。 Total System Global Area 7666352128 bytes Fixed Size 2190736 bytes Variable Size 3942646384 bytes Database Buffers 3707764736 bytes Redo Buffers 13750272 bytes SQL> CREATE CONTROLFILE REUSE DATABASE "ORCLBPM" RESETLOGS ARCHIVELOG 2 MAXLOGFILES 16 3 MAXLOGMEMBERS 3 4 MAXDATAFILES 100 5 MAXINSTANCES 8 6 MAXLOGHISTORY 292 7 LOGFILE 8 GROUP 1 'D:\ORACLE\ORADATA\ORCLBPM\REDO01.LOG' SIZE 50M BLOCKSIZE 512, 9 GROUP 2 'D:\ORACLE\ORADATA\ORCLBPM\REDO02.LOG' SIZE 50M BLOCKSIZE 512, 10 GROUP 3 'D:\ORACLE\ORADATA\ORCLBPM\REDO03.LOG' SIZE 50M BLOCKSIZE 512 11 -- STANDBY LOGFILE 12 DATAFILE 13 'D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF', 14 'D:\ORACLE\ORADATA\ORCLBPM\SYSAUX01.DBF', 15 'D:\ORACLE\ORADATA\ORCLBPM\UNDOTBS01.DBF', 16 'D:\ORACLE\ORADATA\ORCLBPM\USERS01.DBF', 17 'D:\ORACLE\ORADATA\ORCLBPM\HB_SY01.DBF', 18 'D:\ORACLE\ORADATA\ORCLBPM\HB_SY02.DBF', 19 'D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF', 20 'D:\ORACLE\ORADATA\ORCLBPM\BPMSY01.DBF', 21 'D:\ORACLE\ORADATA\ORCLBPM\HMBPM01.DBF', 22 'D:\ORACLE\ORADATA\ORCLBPM\BLOCK01.DBF' 23 CHARACTER SET ZHS16GBK 24 ; 控制文件已创建。
检查一个控制文件中记录的数据文件检查点SCN与数据文件头SCN是否相同,数据文件头检查点scn与控制文件中记录的数据文件检查点scn一样,在没有联机重做日志和归档重做日志的情况下,我们只能将数据库恢复到scn:87499953时间点,并以open resetlogs选项来open数据库
SQL> select FILE#,CHECKPOINT_CHANGE# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 87499953
2 87499953
3 87499953
4 87499953
5 87499953
6 87499953
7 87499953
8 87499953
9 87499953
10 87499953
已选择10行。
SQL> select FILE#, CHECKPOINT_CHANGE#,LAST_CHANGE# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
1 87499953
2 87499953
3 87499953
4 87499953
5 87499953
6 87499953
7 87499953
8 87499953
9 87499953
10 87499953
已选择10行。
这里需要设置隐含参数_allow_resetlogs_corruption=true来open数据库。
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile; 系统已更改。 SQL> shutdown immediate ORA-01109: ?????? 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> startup mount; ORACLE 例程已经启动。 Total System Global Area 7666352128 bytes Fixed Size 2190736 bytes Variable Size 3942646384 bytes Database Buffers 3707764736 bytes Redo Buffers 13750272 bytes 数据库装载完毕。 SQL> alter database open resetlogs; 数据库已更改。 SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\ORADATA\ORCLBPM\TEMP01.DBF' R EUSE; 表空间已更改。 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> startup ORACLE 例程已经启动。 Total System Global Area 7666352128 bytes Fixed Size 2190736 bytes Variable Size 3942646384 bytes Database Buffers 3707764736 bytes Redo Buffers 13750272 bytes 数据库装载完毕。 数据库已经打开。
直此将数据库恢复到备份生成的时间点,但没有归档重做日志和联机重做日志丢失了半天的数据。