首页 » ORACLE » How to restore database only have previous datafile and archive log Rman backupset?(只有数据文件和归档日志备份集的恢复)

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的自动备份文件同样应该保管好。

打赏

对不起,这篇文章暂时关闭评论。