在无备份信息和无备份制文件及非catalog下的异机恢复数据库

现在只有备份到本机disk的rman热备和归档文件,没有单独备份控制文件和参数文件,如何在异机上恢复数据库
通过对归档文件dump的方法,找到数据库的DBID:
alter system dump logfile '/itapp/backup/CloudArch_1_2304_929439205.log';
SQL> oradebug setmypid
Statement processed.
SQL> oradebug tracefile_name
/itapp/diag/rdbms/itdev/itdev/trace/itdev_ora_26643.trc

查看归档文件dump出的文件头信息:
DUMP OF REDO FROM FILE '/itapp/backup/CloudArch_1_2304_929439205.log'
 Opcodes *.*
 RBAs: 0x000000.00000000.0000 thru 0xffffffff.ffffffff.ffff
 SCNs: scn: 0x0000.00000000 thru scn: 0xffff.ffffffff
 Times: creation thru eternity
 FILE HEADER:
        Compatibility Vsn = 186647552=0xb200400
        Db ID=1748523235=0x683858e3, Db Name='ITDEV'
        Activation ID=1748577251=0x68392be3
        Control Seq=205972=0x32494, File size=102400=0x19000
        File Number=3, Blksiz=512, File Type=2 LOG
上面显示dbid为1748523235,数据库名为ITDEV。

用常规方法来恢复控制文件:
rman target /
set dbid=1748523235;
restore controlfile from '/itapp/backup/full_ITDEV_20171209_215_1';
RMAN> set dbid=1748523235;
executing command: SET DBID
restore controlfile from '/itapp/backup/full_ITDEV_20171209_214_1';
RMAN> 
Starting restore at 17-DEC-17
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=4708 device type=DISK

channel ORA_DISK_1: restoring control file
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 12/17/2017 16:02:19
ORA-19697: standby control file not found in backup set
直接通过常规方法恢复控制文件提示找不到文件。
DBMS_BACKUP_RESTORE用于特殊情况下的恢复 
一般如下:系统崩溃,rman使用控制文件,没有使用控制文件自动备份,现在仅有最后一次全备(备份中包括控制文件)和归档备份.
通常这种情况下不能使用常规RMAN来恢复,因为此全备份中备份的控制文件中没有包含本次的备份信息,rman使用控制文件备份的时候是先备份控制文件,后备份其它信息
包的使用说明:
SQL>startup force nomount;
SQL>
DECLARE
devtype varchar2(256);
done boolean;
BEGIN
--分配一个device channel,如果使用的操作系统文件,type就为空,如果是从磁带上恢复要用 "sbt_tape"; 
devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>'t1'); 
--指明开始restore
sys.dbms_backup_restore.restoreSetDatafile;
--指出待恢复文件目标存储位置;
sys.dbms_backup_restore.restoreControlfileTo(cfname=>'D:\ORACLE\ORADATA\FENET\CONTROL01.CTL');
--指定备份集的位置
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:\ORA9I6095222264.RMAN', params=>null);
--释放通道
sys.dbms_backup_restore.deviceDeallocate;
END;
可以通过该语句得到file#和name的对应关系
select 'sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>' || file# ||
       ',toname=>' ||chr(39)|| name ||chr(39) || ');',
       'sys.dbms_backup_restore.applySetDatafile(dfnumber=>' || file# ||
       ',toname=>' ||chr(39)|| name ||chr(39) || ');'
  from v$datafile; 
先从备份中提取控制文件:
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=>'/itdata/itdev/control01.ctl');
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'/itapp/backup/full_ITDEV_20171209_214_1', params=>null);
sys.dbms_backup_restore.deviceDeallocate;
END;
ERROR at line 1:
ORA-19697: standby control file not found in backup set
ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 5940
ORA-06512: at line 
由于没有任何关于该库的数据文件信息,从另外一个同类用途的库中查到相关数据文件信息,整理的控制文件如下,由于数据文件不存在,无法直接建立控制文件,所以先将数据文件提取出来。
CREATE CONTROLFILE set DATABASE "itdev" RESETLOGS
      MAXLOGFILES 16
      MAXLOGMEMBERS 3
      MAXDATAFILES 100
      MAXINSTANCES 8
      MAXLOGHISTORY 292
  LOGFILE
    GROUP 1 '/itdata/itdev/redo01.log'  SIZE 50M BLOCKSIZE 512,
    GROUP 2 '/itdata/itdev/redo02.log'  SIZE 50M BLOCKSIZE 512,
    GROUP 3 '/itdata/itdev/redo03.log'  SIZE 50M BLOCKSIZE 512
  -- STANDBY LOGFILE
  DATAFILE
    '/itdata/itdev/system01.dbf',
    '/itdata/itdev/sysaux01.dbf',
    '/itdata/itdev/undotbs01.dbf',
    '/itdata/itdev/users01.dbf',
    '/itdata/itdev/md01.dbf',
    '/itdata/itdev/mx01.dbf'
  CHARACTER SET AL32UTF8;
数据文件提取:
因为有两个备份片:itapp/backup/full_ITDEV_20171209_214_1和itapp/backup/full_ITDEV_20171209_215_1,不清楚每个备份片上有哪些数据文件,所以前面几次提取数据文件时需要根据报错来调整提取脚本:
DECLARE
*
ERROR at line 1:
ORA-19583: conversation terminated due to error
ORA-19870: error while restoring backup piece
/itapp/backup/full_ITDEV_20171209_214_1
ORA-19615: some files not found in backup set
ORA-19613: datafile 6 not found in backup set
ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 5940
ORA-06512: at line 10
重新调整脚本后,按如下来提取数据文件,可以开两个sqlplus窗口同时提取。
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=>'/itdata/itdev/system01.dbf');  
  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>04, toname=>'/itdata/itdev/users01.dbf');   
  sys.dbms_backup_restore.restoreBackupPiece(done=>done, handle=>'/itapp/backup/full_ITDEV_20171209_214_1', params=>null);
  sys.dbms_backup_restore.deviceDeallocate;
  END;
/
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=>02, toname=>'/itdata/itdev/sysaux01.dbf');
  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>03, toname=>'/itdata/itdev/undotbs01.dbf');
  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>05, toname=>'/itdata/itdev/rdmd01.dbf');
  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>06, toname=>'/itdata/itdev/rdmx01.dbf');
  sys.dbms_backup_restore.restoreBackupPiece(done=>done, handle=>'/itapp/backup/full_ITDEV_20171209_215_1', params=>null);
  sys.dbms_backup_restore.deviceDeallocate;
  END;
/
 同时alert.log中可看到如下恢复信息是:
Full restore complete of datafile 4 to datafile copy /itdata/itdev/users01.dbf.  Elapsed time: 0:00:00 
  checkpoint is 13617154978932
  last deallocation scn is 3
Sun Dec 17 15:23:00 2017
Full restore complete of datafile 1 to datafile copy /itdata/itdev/system01.dbf.  Elapsed time: 0:01:19 
  checkpoint is 13617154978932
  last deallocation scn is 5678184
  Undo Optimization current scn is 13617154977326
Sun Dec 17 15:29:57 2017
Full restore complete of datafile 5 to datafile copy /itdata/itdev/rd01.dbf.  Elapsed time: 0:00:01 
  checkpoint is 13617154978931
  last deallocation scn is 925704
Full restore complete of datafile 6 to datafile copy /itdata/itdev/rdx01.dbf.  Elapsed time: 0:00:23 
  checkpoint is 13617154978931
  last deallocation scn is 925704
Sun Dec 17 15:31:18 2017
Full restore complete of datafile 3 to datafile copy /itdata/itdev/undotbs01.dbf.  Elapsed time: 0:01:09 
  checkpoint is 13617154978931
  last deallocation scn is 13617154970031
  Undo Optimization current scn is 13617154977326
Sun Dec 17 15:33:39 2017
Full restore complete of datafile 2 to datafile copy /itdata/itdev/sysaux01.dbf.  Elapsed time: 0:03:51 
  checkpoint is 13617154978931
  last deallocation scn is 13617154954398
再建立控制文件:
CREATE CONTROLFILE set DATABASE "itdev" RESETLOGS
      MAXLOGFILES 16
      MAXLOGMEMBERS 3
      MAXDATAFILES 100
      MAXINSTANCES 8
      MAXLOGHISTORY 292
  LOGFILE
    GROUP 1 '/itdata/itdev/redo01.log'  SIZE 50M BLOCKSIZE 512,
    GROUP 2 '/itdata/itdev/redo02.log'  SIZE 50M BLOCKSIZE 512,
    GROUP 3 '/itdata/itdev/redo03.log'  SIZE 50M BLOCKSIZE 512
  -- STANDBY LOGFILE
  DATAFILE
    '/itdata/itdev/system01.dbf',
    '/itdata/itdev/sysaux01.dbf',
    '/itdata/itdev/undotbs01.dbf',
    '/itdata/itdev/users01.dbf',
    '/itdata/itdev/rdmd01.dbf',
    '/itdata/itdev/rdmx01.dbf'
  CHARACTER SET AL32UTF8;
建立成功后,数据库自动启动到mount状态:
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
MOUNTED
开始进行不完全恢复:
recover from '/itrdmapp/backup' database until cancel using backup controlfile ;
应用完所有归档后,执行alter database open resetlogs开启库
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/itdata/itdev/system01.dbf
/itdata/itdev/sysaux01.dbf
/itdata/itdev/undotbs01.dbf
/itdata/itdev/users01.dbf
/itdata/itdev/md01.dbf
/itdata/itdev/mx01.dbf
/itapp/db/11.2.0.4/dbs/MISSING00007
/itapp/db/11.2.0.4/dbs/MISSING00008
发现有两个文件没有提取,再进一步查看表空间信息。
set line 100
set pagesize 100
col file_name for a50
col file_id for 99
col tablespace_name for a10
col status for a10
select file_name,file_id,tablespace_name,status from dba_data_files;

FILE_NAME                                          FILE_ID TABLESPACE STATUS
-------------------------------------------------- ------- ---------- ----------
/itdata/itdev/mx01.dbf                           6 IOX        AVAILABLE
/itdata/itdev/md01.dbf                           5 IOD        AVAILABLE
/itdata/itdev/users01.dbf                          4 USERS      AVAILABLE
/itdata/itdev/undotbs01.dbf                        3 UNDOTBS1   AVAILABLE
/itdata/itdev/sysaux01.dbf                         2 SYSAUX     AVAILABLE
/itdata/itdev/system01.dbf                         1 SYSTEM     AVAILABLE
/itapp/db/11.2.0.4/dbs/MISSING00007                   7 MX       AVAILABLE
/itapp/db/11.2.0.4/dbs/MISSING00008                   8 MD       AVAILABLE

根据表空间信息与对已恢复的数据文件对应关系,发现:
file# 5和file# 6是对应表空间IOD和IOX,而文件名恢复成了表空间MD和MX的文件,另外,file# 7和file# 8没有恢复出来,它们是表空间MD和MX对应的文件。
所以需要关库重新恢复文件,重新调整提取文件的脚本:
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=>'/itdata/itdev/system01.dbf');  
  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>04, toname=>'/itdata/itdev/users01.dbf'); 
  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>08, toname=>'/itdata/itdev/d01.dbf');
  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>07, toname=>'/itdata/itdev/mx01.dbf');  
  sys.dbms_backup_restore.restoreBackupPiece(done=>done, handle=>'/itapp/backup/full_ITDEV_20171209_214_1', params=>null);
  sys.dbms_backup_restore.deviceDeallocate;
  END;
/
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=>02, toname=>'/itdata/itdev/sysaux01.dbf');
  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>03, toname=>'/itdata/itdev/undotbs01.dbf');
  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>05, toname=>'/itdata/itdev/iod01.dbf');
  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>06, toname=>'/itdata/itdev/iox01.dbf');
  sys.dbms_backup_restore.restoreBackupPiece(done=>done, handle=>'/itapp/backup/full_ITDEV_20171209_215_1', params=>null);
  sys.dbms_backup_restore.deviceDeallocate;
  END;
/

再建立控制文件:
CREATE CONTROLFILE set DATABASE "itdev" RESETLOGS
      MAXLOGFILES 16
      MAXLOGMEMBERS 3
      MAXDATAFILES 100
      MAXINSTANCES 8
      MAXLOGHISTORY 292
  LOGFILE
    GROUP 1 '/itdata/itdev/redo01.log'  SIZE 50M BLOCKSIZE 512,
    GROUP 2 '/itdata/itdev/redo02.log'  SIZE 50M BLOCKSIZE 512,
    GROUP 3 '/itdata/itdev/redo03.log'  SIZE 50M BLOCKSIZE 512
  -- STANDBY LOGFILE
  DATAFILE
    '/itdata/itdev/system01.dbf',
    '/itdata/itdev/sysaux01.dbf',
    '/itdata/itdev/undotbs01.dbf',
    '/itdata/itdev/users01.dbf',
    '/itdata/itdev/iod01.dbf',
    '/itdata/itdev/iox01.dbf',
    '/itdata/itdev/rdmx01.dbf',
    '/itdata/itdev/rdmd01.dbf'
CHARACTER SET AL32UTF8;
开始进行不完全恢复:
recover from '/itapp/backup' database until cancel using backup controlfile ;
应用完所有归档后,执行alter database open resetlogs开启库
增加临时文件:
alter tablespace temp add tempfile '/itdata/itdev/temp01.dbf' size 2g autoextend on next 100m maxsize 20g;
最后检查确认数据文件是否正常:
set line 100
set pagesize 100
col file_name for a50
col file_id for 99
col tablespace_name for a10
col status for a10
select file_name,file_id,tablespace_name,status from dba_data_files
order by file_id;

FILE_NAME                                          FILE_ID TABLESPACE STATUS
-------------------------------------------------- ------- ---------- ----------
/itdata/itdev/system01.dbf                         1 SYSTEM     AVAILABLE
/itdata/itdev/sysaux01.dbf                         2 SYSAUX     AVAILABLE
/itdata/itdev/undotbs01.dbf                        3 UNDOTBS1   AVAILABLE
/itdata/itdev/users01.dbf                          4 USERS      AVAILABLE
/itdata/itdev/iod01.dbf                            5 IOD        AVAILABLE
/itdata/itdev/iox01.dbf                            6 IOX        AVAILABLE
/itdata/itdev/mx01.dbf                           7 RDMX       AVAILABLE
/itdata/itdev/md01.dbf                           8 RDMD       AVAILABLE
检查alert.log确认没有报错。
恢复后记:
   当只有数据文件全备和所有归档存在,而无控制文件备份且也不知道库有哪些数据文件存在时,可以先用以上方法将数据文件file# 1到file# 4这四个先恢复出来,然后建立只包含这4个数据文件的控制文件,应用所有归档(因为库小,全部应用完也非常快,若库大,归档很多时,只应用少量归档,能打开库就行),用不完全恢复打开db,根据dba_tablespaces获得表空间和数据文件对应关系,确认有哪些文件需要恢复,调整好数据文件提取脚本后,再重新按上面方法重新恢复。

你可能感兴趣的:(oracle)