您的位置:首页 > 数据库

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

2017-12-31 15:57 417 查看
现在只有备份到本机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获得表空间和数据文件对应关系,确认有哪些文件需要恢复,调整好数据文件提取脚本后,再重新按上面方法重新恢复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: