How to restore database only have previous datafile and archive log Rman backupset?(只有数据文件和归档日志备份集的恢复)
元旦期间帮一朋友恢复了套数据库, 情景是这样的,25号0时有做RMAN 0级备份含datafile和当时的archivelog,25号白天删除了一个非常重要的表空间, 现在需要恢复那个表空间,是一套单实例的11.1.0.6 的WINDOWS平台的数据库, 接手时只有上面的6个备份集文件(只有DATAFILE AND ARCHIVELOG)和软件,和当前的control file
no autobackup anywhere
no older controlfile available
no snapshot controlfile available
no redo log available
no backup logfiles
no “backup controlfile to trace” information
no DBID
no alert.log
因当前的控制文件不可用,online log不可用,处理思路如下
nomount 启动;
用DBMS_BACKUP_RESTORE抽数据文件;
编辑创建控制文件脚本;
创建控制文件;
catalog 备份集信息;
基于时间点恢复;
open resetlogs;
用当用的控制文件catalog 备份集后生成的备份文件列表(datafile number下面有用)
BS 关键字 类型 LV 大小 ------- ---- -- ---------- 6 Full 1.06G 备份集 6 中的数据文件列表 文件 LV 类型 Ckp SCN Ckp 时间 名称 ---- -- ---- ---------- ---------- ---- 1 Full 10168874776976 25-12月-15 E:\APP\SYS-ADMIN\ORADATA\ORCL\SYSTEM01.DBF 2 Full 10168874776976 25-12月-15 E:\APP\SYS-ADMIN\ORADATA\ORCL\SYSAUX01.DBF 3 Full 10168874776976 25-12月-15 4 Full 10168874776976 25-12月-15 E:\APP\SYS-ADMIN\ORADATA\ORCL\USERS01.DBF 5 Full 10168874776976 25-12月-15 E:\APP\SYS-ADMIN\PRODUCT\11.1.0\DB_1\ORADATA\VSM.ORA 6 Full 10168874776976 25-12月-15 8 Full 10168874776976 25-12月-15 E:\APP\SYS-ADMIN\PRODUCT\11.1.0\DB_1\ORADATA\GGS.ORA 备份集 副本号 1 属于备份集 6 设备类型 经过时间 完成时间 压缩标记 ----------- ------------ ---------- ---------- --- DISK 00:00:00 03-1月 -16 YES TAG20151225T000021 备份集 6 副本号 1的备份片段列表 BP 关键字 Pc# 状态 段名称 ------- --- ----------- ---------- 6 1 AVAILABLE D:\RMAN_R\RMAN_DB_ORCL_20151225_LCQPLJCL_1_1.RMAN
SQL>starup nomount SQL>DECLARE V_DEVICE VARCHAR2(100); V_FINISH BOOLEAN; TYPE T_FILENAMETABLE IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER; V_FILENAMETABLE T_FILENAMETABLE; V_MAXPIECES NUMBER :=1; BEGIN V_FILENAMETABLE(1) :='d:\rman_r\RMAN_DB_ORCL_20151225_LCQPLJCL_1_1.RMAN'; V_DEVICE := SYS.DBMS_BACKUP_RESTORE.DEVICEALLOCATE(); SYS.DBMS_BACKUP_RESTORE.RESTORESETDATAFILE; SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(1); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(2); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(3); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(4); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(5); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(6); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(8); FOR I IN 1..V_MAXPIECES LOOP SYS.DBMS_BACKUP_RESTORE.RESTOREBACKUPPIECE(V_FILENAMETABLE(I), V_FINISH); IF V_FINISH THEN SYS.DBMS_BACKUP_RESTORE.DEVICEDEALLOCATE; RETURN; END IF; END LOOP; SYS.DBMS_BACKUP_RESTORE.DEVICEDEALLOCATE; END; / * ERROR at line 1: ORA-19624: operation failed, retry possible ORA-19616: output file name must be specified if database not mounted ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 2071 ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 2055 ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 2047 ORA-06512: at line 11
NOTE: 错误提示很明显,因为是nomount启动,需要指定输出路径,因为路径在control file中,当前没有加载control file. 猜测了6号文件就是我们要恢复的数据文件
DECLARE V_DEVICE VARCHAR2(100); V_FINISH BOOLEAN; TYPE T_FILENAMETABLE IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER; V_FILENAMETABLE T_FILENAMETABLE; V_MAXPIECES NUMBER :=1; BEGIN V_FILENAMETABLE(1) :='d:\rman_r\RMAN_DB_ORCL_20151225_LCQPLJCL_1_1.RMAN'; V_DEVICE := SYS.DBMS_BACKUP_RESTORE.DEVICEALLOCATE(); SYS.DBMS_BACKUP_RESTORE.RESTORESETDATAFILE; SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(1,'d:\oranewdata\SYSTEM01.DBF'); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(2,'d:\oranewdata\SYSAUX01.dbf'); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(3,'d:\oranewdata\undotbs01.dbf'); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(4,'d:\oranewdata\USERS01.dbf'); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(5,'d:\oranewdata\VSM.ora'); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(6,'d:\oranewdata\dms.ora'); SYS.DBMS_BACKUP_RESTORE.RESTOREDATAFILETO(8,'d:\oranewdata\GGS.ora'); FOR I IN 1..V_MAXPIECES LOOP SYS.DBMS_BACKUP_RESTORE.RESTOREBACKUPPIECE(V_FILENAMETABLE(I), V_FINISH); IF V_FINISH THEN SYS.DBMS_BACKUP_RESTORE.DEVICEDEALLOCATE; RETURN; END IF; END LOOP; SYS.DBMS_BACKUP_RESTORE.DEVICEDEALLOCATE; END; / -- done.
上面我是新建的目录,把数据文件生成到了一个新目录,下面重建控制文件,注意增加了我们要恢复的表空间数据文件
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS FORCE LOGGING ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 11685 LOGFILE GROUP 1 'E:\APP\SYS-ADMIN\ORADATA\ORCL\REDO01.LOG' SIZE 50M, GROUP 2 'E:\APP\SYS-ADMIN\ORADATA\ORCL\REDO02.LOG' SIZE 50M, GROUP 3 'E:\APP\SYS-ADMIN\ORADATA\ORCL\REDO03.LOG' SIZE 50M -- STANDBY LOGFILE DATAFILE 'd:\oranewdata\SYSTEM01.DBF', 'd:\oranewdata\SYSAUX01.dbf', 'd:\oranewdata\undotbs01.dbf', 'd:\oranewdata\USERS01.dbf', 'd:\oranewdata\VSM.ora', 'd:\oranewdata\dms.ora', -- droped tablespace 'd:\oranewdata\GGS.ora' CHARACTER SET ZHS16GBK ;
重建控制文件成功,数据库可以mount, 下面就可以恢复数据库了
rman> catalog start with '<backupset path>' rman> list backup summary; rman> restore archivelog all; run { set until sequence <max seq# available archivelog above output>; recover database; }
注册了备份信息到新的控制文件中,列出最大的arch 编号,恢复数据库成功,恢复控制文件也可以使用上面的SYS.DBMS_BACKUP_RESTORE包里提供的方法,最后因为当前online redo不可用,所以open resetlogs.成功打开数据库.
rman> alter database open resetlogs;
Summary:
备份非常的重要,前提是备份文件尽可能的保留完整有效,除了datafile和archivelog的备份文件,还有如备份时的logfile, 控制文件和spfile的自动备份文件同样应该保管好。
对不起,这篇文章暂时关闭评论。