rman备份,没用catalog ,但控制文件丢失,怎么解决?
情况描述:客户报告数据库故障,新来的系统管理员误操作。删掉了一些文件。
询问:删掉了那些文件?
答曰:所有重要数据文件,所有控制文件。数据库原来是归档模式,用rman备份数据,rman 使用控制文件。
幸运的是,最后一次rman full
备份是包括了控制文件在内。现在状况是数据库无法启动(废话,当然无法启动了 )
不用说,客户的备份方案不够完善,但是这时候再去说这些话已经是马后炮了。还有,客户有Full备份。这对我们来说是个好消息。
其实这种问题有的时候倒的确会遇到。如何进行解决呢?
在Oracle 816 以后的版本中,Oracle提供了一个包:DBMS_BACKUP_RESTORE.
DBMS_BACKUP_RESTORE 包是由dbmsbkrs.sql 和 prvtbkrs.plb
这两个脚本创建的.catproc.sql 脚本运行
后会调用这两个包.所以是每个数据库都有的这个包是Oracle服务器和操作系统之间IO操作的接口.由恢复管理器直接调用。
由此可见,我们可以在数据库nomount 情况下调用这些package ,来达到我们的恢复目的。
在dbmsbkrs.sql 和prvtbkrs.plb 这两个脚本中有详细的说明文档,就不一一加以翻译了。
1:恢复控制文件:
SQL> startup nomount;
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed
Size 453532 bytes
Variable
Size 109051904 bytes
Database
Buffers 33554432 bytes
Redo
Buffers 667648 bytes
SQL> DECLARE
devtype varchar2(256);
done boolean;
BEGIN
devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>'T1');
sys.dbms_backup_restore.restoreSetDatafile;
sys.dbms_backup_restore.restoreControlfileTo(cfname=>'c:\oracle\Control01.ctl');
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:\DB_LJKJ_09LMFJP7_1_1_20100828.BKP',
params=>null);
sys.dbms_backup_restore.deviceDeallocate;
END;
/
PL/SQL 过程已成功完成。
对以上内容的解释:
第五行 分配一个device channel
,因为使用的操作系统文件,所以这里为空,如果是从磁带上恢复要用"sbt_tape"
第六行 开始restore
第七行 指出待恢复文件目标存储位置
第八行 从哪个备份片中恢复,控制文件只从第一个备份片中恢复。
第九行 释放设备通道
将恢复的控制文件按照初始化参数文件的要求进行复制。
此时可以将数据库启动到mount状态,查询数据文件
sql>alter database mount;
SQL> select * from v$dbfile;
FILE# NAME
---------- ----------------------------------------
9 C:\ORACLE\ORADATA\LJKJ\XDB01.DBF
8 C:\ORACLE\ORADATA\LJKJ\USER3
2 C:\ORACLE\ORADATA\LJKJ\UNDOTBS01.DBF
7 C:\ORACLE\ORADATA\LJKJ\TOOLS01.DBF
1 C:\ORACLE\ORADATA\LJKJ\SYSTEM01.DBF
6 C:\ORACLE\ORADATA\LJKJ\ODM01.DBF
5 C:\ORACLE\ORADATA\LJKJ\INDX01.DBF
4 C:\ORACLE\ORADATA\LJKJ\EXAMPLE01.DBF
3 C:\ORACLE\ORADATA\LJKJ\DRSYS01.DBF
10 C:\ORACLE\ORADATA\LJKJ\PERF.DBF
11 C:\ORACLE\ORADATA\LJKJ\FZS.DBF
已选择11行。
SQL> shutdown immediate
SQL> startup nomount;
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed
Size 453532 bytes
Variable
Size 109051904 bytes
Database
Buffers 33554432 bytes
Redo
Buffers 667648 bytes
SQL>
SQL>DECLARE
devtype
varchar2(256);
done
boolean;
BEGIN
devtype:=sys.dbms_backup_restore.deviceAllocate
(type=>'',ident=>'t1');
sys.dbms_backup_restore.restoreSetDatafile;
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>01,toname=>'C:\ORACLE\ORADATA\LJKJ\SYSTEM01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>02,toname=>'C:\ORACLE\ORADATA\LJKJ\UNDOTBS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>03,toname=>'C:\ORACLE\ORADATA\LJKJ\DRSYS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>04,toname=>'C:\ORACLE\ORADATA\LJKJ\EXAMPLE01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>05,toname=>'C:\ORACLE\ORADATA\LJKJ\INDX01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>06,toname=>'C:\ORACLE\ORADATA\LJKJ\ODM01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>07,toname=>'C:\ORACLE\ORADATA\LJKJ\TOOLS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>08,toname=>'C:\ORACLE\ORADATA\LJKJ\USER3');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>09,toname=>'C:\ORACLE\ORADATA\LJKJ\XDB01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>10,toname=>'C:\ORACLE\ORADATA\LJKJ\PERF.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>11,toname=>'C:\ORACLE\ORADATA\LJKJ\FZS.DBF');
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:\DB_LJKJ_09LMFJP7_1_1_20100828.BKP',
params=>null);
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:\DB_LJKJ_09LMFJP7_2_1_20100828.BKP',
params=>null);
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:\DB_LJKJ_09LMFJP7_3_1_20100828.BKP',
params=>null);
sys.dbms_backup_restore.deviceDeallocate;
END;
/
PL/SQL 过程已成功完成。
SQL>
SQL> alter database mount;
数据库已更改。
SQL> recover database using backup controlfile until
cancel;
ORA-00279: ?? 570038 (? 08/27/2010 19:58:11 ??) ???? 1 ????
ORA-00289: ??: C:\ARCHIVED\ARC00019.001
ORA-00280: ?? 570038 ???? 1 ???? # 19 ???
SQL> recover database using backup controlfile until
cancel;
ORA-00279: ?? 570038 (? 08/27/2010 19:58:11 ??) ???? 1 ????
ORA-00289: ??: C:\ARCHIVED\ARC00019.001
ORA-00280: ?? 570038 ???? 1 ???? # 19 ???
指定日志: {=suggested | filename |
AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;
数据库已更改。