朋友客户的数据库由于磁盘损坏,从存储级别抽取出了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 数据库装载完毕。 数据库已经打开。
直此将数据库恢复到备份生成的时间点,但没有归档重做日志和联机重做日志丢失了半天的数据。