转:Oracle Rman の dbms_backup_restore

之前看文章,说建议数据库用rman备份的话,最好采用catalog数据库,将备份信息保留在catalog库中。对于没有catalog的数据库rman备份,备份信息将保留在控制文件中。
 
因此如果控制文件丢失,还原起来就比较麻烦,需要用dbms_backup_restore来进行恢复(恢复方式见文章的附录),其实想想,dbms_backup_restore其实也没那么常用了。因为:
 
1、控制文件如果有自动备份,那么可以从自动备份还原。
 
 2、如果有单独备份控制文件,那么可以从这个单独备份的backupset处还原。
 
 3、如果之前有做数据库全备,全备中就包含了控制文件和spfile的备份,可以从全备中还原。
 
 4、另外还可以从控制文件的snapshot还原。
 
 5、从上面的四种方法都无法还原控制文件,那么只能从备份集restore数据文件以及arch,然后重建控制文件,再resetlogs打开数据库。
 
====================================
 附录(在控制文件都无法恢复的情况,用dbms_backup_restore restore数据文件,再重建控制文件,在open resetlogs):
 
SQL> l
   1* select count(*) from t1
 SQL> /
 
   COUNT(*)
 ----------
       1024
 
 SQL>
 SQL>
 SQL>
 SQL> insert into t1 select * from t1;
 
 1024 rows created.
 
 SQL> /
 
 2048 rows created.
 
 SQL> /
 
 4096 rows created.
 
 SQL> select count(*) from t1;
 
   COUNT(*)
 ----------
       8192
 
 SQL>
 SQL>--commit前数据为1024行,insert到8192行,但是未commit
 SQL> host
 Microsoft Windows XP [Version 5.1.2600]
 (C) Copyright 1985-2001 Microsoft Corp.
 
 C:/Documents and Settings/Administrator>rman target /
 
 Recovery Manager: Release 10.2.0.1.0 - Production on Thu Sep 9 16:53:31 2010
 
 Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 connected to target database: ORA10G (DBID=4045875789)
 
 RMAN> run {
 2> allocate channel c1 type disk;
 3> backup
 4>      incremental level=0
 5>  filesperset 5
 6>      format 'df_%s_%p_%t'
 7>      (database);
 8>  sql 'alter system archive log current';
 9> release channel c1;
 10>  }
 
 using target database control file instead of recovery catalog
 allocated channel: c1
 channel c1: sid=146 devtype=DISK
 
 Starting backup at 09-SEP-10
 channel c1: starting incremental level 0 datafile backupset
 channel c1: specifying datafile(s) in backupset
 input datafile fno=00001 name=D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/SYSTEM01.DBF
 input datafile fno=00002 name=D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/UNDOTBS01.DBF
 input datafile fno=00003 name=D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/SYSAUX01.DBF
 input datafile fno=00004 name=D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/USERS01.DBF
 channel c1: starting piece 1 at 09-SEP-10
 channel c1: finished piece 1 at 09-SEP-10
 piece handle=D:/ORACLE/PRODUCT/10.2.0/DB_1/DATABASE/DF_19_1_729276821 tag=TAG20100909T165341 comment=NONE
 channel c1: backup set complete, elapsed time: 00:00:50
 channel c1: starting incremental level 0 datafile backupset
 channel c1: specifying datafile(s) in backupset
 including current control file in backupset
 including current SPFILE in backupset
 channel c1: starting piece 1 at 09-SEP-10
 channel c1: finished piece 1 at 09-SEP-10
 piece handle=D:/ORACLE/PRODUCT/10.2.0/DB_1/DATABASE/DF_20_1_729276871 tag=TAG20100909T165341 comment=NONE
 channel c1: backup set complete, elapsed time: 00:00:03
 Finished backup at 09-SEP-10
 
 sql statement: alter system archive log current
 
 released channel: c1
 
 RMAN>
 
 RMAN> run {
 2>      allocate channel c1 type disk;
 3>      backup
 4>               filesperset 20
 5>         format 'arch_%s_%p_%t'
 6>         (archivelog all delete input);
 7>    }
 
 allocated channel: c1
 channel c1: sid=146 devtype=DISK
 
 Starting backup at 09-SEP-10
 current log archived
 channel c1: starting archive log backupset
 channel c1: specifying archive log(s) in backup set
 input archive log thread=1 sequence=71 recid=42 stamp=729276793
 input archive log thread=1 sequence=72 recid=43 stamp=729276794
 input archive log thread=1 sequence=73 recid=44 stamp=729276795
 input archive log thread=1 sequence=74 recid=45 stamp=729276878
 input archive log thread=1 sequence=75 recid=46 stamp=729276880
 channel c1: starting piece 1 at 09-SEP-10
 channel c1: finished piece 1 at 09-SEP-10
 piece handle=D:/ORACLE/PRODUCT/10.2.0/DB_1/DATABASE/ARCH_21_1_729276880 tag=TAG20100909T165440 comment=NONE
 channel c1: backup set complete, elapsed time: 00:00:02
 channel c1: deleting archive log(s)
 archive log filename=D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_1_71_68K83SGM_.ARC recid=42 stamp=7292
 archive log filename=D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_1_72_68K83TF4_.ARC recid=43 stamp=7292
 archive log filename=D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_1_73_68K83VG3_.ARC recid=44 stamp=7292
 archive log filename=D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_1_74_68K86GD3_.ARC recid=45 stamp=7292
 archive log filename=D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_1_75_68K86HW7_.ARC recid=46 stamp=7292
 Finished backup at 09-SEP-10
 released channel: c1
 
 RMAN>
 
 RMAN> run {
 2>      allocate channel c1 type disk;
 3>      backup
 4>               filesperset 20
 5>         format 'ctrl_%s_%p_%t'
 6>         current controlfile;
 7>    }
 
 allocated channel: c1
 channel c1: sid=146 devtype=DISK
 
 Starting backup at 09-SEP-10
 channel c1: starting full datafile backupset
 channel c1: specifying datafile(s) in backupset
 including current control file in backupset
 channel c1: starting piece 1 at 09-SEP-10
 channel c1: finished piece 1 at 09-SEP-10
 piece handle=D:/ORACLE/PRODUCT/10.2.0/DB_1/DATABASE/CTRL_22_1_729276884 tag=TAG20100909T165444 comment=NONE
 channel c1: backup set complete, elapsed time: 00:00:02
 Finished backup at 09-SEP-10
 released channel: c1
 
 RMAN>
 
 RMAN>--备份全库,arch文件,控制文件。其实后面我们可以从全库备份或者控制文件备份还原的,但是这里我们不演示用这种方式还原,我们用dbms_backup_restore包来做还原
 
 RMAN> exit
 
 
 Recovery Manager complete.
 
 C:/Documents and Settings/Administrator>exit
 
 SQL>
 
 SQL>
 SQL>
 SQL> conn / as sysdba
 Connected.
 SQL>
 SQL>
 SQL>
 SQL> shutdown abort
 ORACLE instance shut down.
 SQL>
 SQL>
 SQL>
 SQL> exit
 Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
 With the Partitioning, Oracle Label Security, OLAP and Data Mining options
 
 C:/Documents and Settings/Administrator>
 C:/Documents and Settings/Administrator>
 C:/Documents and Settings/Administrator>
 C:/Documents and Settings/Administrator>
 C:/Documents and Settings/Administrator>
 C:/Documents and Settings/Administrator>sqlplus "/ as sysdba"
 
 SQL*Plus: Release 10.2.0.1.0 - Production on Thu Sep 9 17:20:29 2010
 
 Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 Connected to an idle instance.
 SQL> startup nomount
 ORACLE instance started.
 
 Total System Global Area  209715200 bytes
 Fixed Size                  1248116 bytes
 Variable Size              79692940 bytes
 Database Buffers          121634816 bytes
 Redo Buffers                7139328 bytes
 SQL>
 SQL>--开始用dbms_backup_restore包来restore数据文件:
 SQL> declare
   2  devtype varchar2(256);
   3  done boolean;
   4  begin
   5  devtype:=sys.dbms_backup_restore.deviceallocate(type=>'',ident=>'t1');
   6  sys.dbms_backup_restore.restoresetdatafile;
   7  sys.dbms_backup_restore.restoredatafileto(dfnumber=>01,toname=>'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/SYSTEM01.DBF');
   8  sys.dbms_backup_restore.restoredatafileto(dfnumber=>02,toname=>'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/UNDOTBS01.DBF');
   9  sys.dbms_backup_restore.restoredatafileto(dfnumber=>03,toname=>'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/SYSAUX01.DBF');
  10  sys.dbms_backup_restore.restoredatafileto(dfnumber=>04,toname=>'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/USERS01.DBF');
  11  sys.dbms_backup_restore.restorebackuppiece(done=>done,handle=>'D:/oracle/product/10.2.0/db_1/database/DF_19_1_729276821',params=>null);
  12  sys.dbms_backup_restore.devicedeallocate;
  13  end;
  14  /
 
 PL/SQL procedure successfully completed.
 
 SQL>
 SQL>
 SQL>--重建控制文件:
 SQL> CREATE CONTROLFILE REUSE DATABASE "ORA10G" RESETLOGS  ARCHIVELOG
   2      MAXLOGFILES 16
   3      MAXLOGMEMBERS 3
   4      MAXDATAFILES 100
   5      MAXINSTANCES 8
   6      MAXLOGHISTORY 292
   7  LOGFILE
   8    GROUP 1 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/REDO01.LOG'  SIZE 50M,
   9    GROUP 2 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/REDO02.LOG'  SIZE 50M,
  10    GROUP 3 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/REDO03.LOG'  SIZE 50M
  11  DATAFILE
  12    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/SYSTEM01.DBF',
  13    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/UNDOTBS01.DBF',
  14    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/SYSAUX01.DBF',
  15    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/USERS01.DBF'
  16  CHARACTER SET ZHS16GBK
  17  ;
 
 Control file created.
 
 SQL>
 SQL> recover database;
 ORA-00283: recovery session canceled due to errors
 ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
 
 
 SQL> recover database using backup controlfile;
 ORA-00279: change 1239559 generated at 09/09/2010 16:53:41 needed for thread 1
 ORA-00289: suggestion :
 D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_
 1_74_%U_.ARC
 ORA-00280: change 1239559 for thread 1 is in sequence #74
 
 
 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
 SQL> --需要74号arch来做recover
 SQL> --restore 74号arch
 SQL> declare
   2  devtype varchar2(256);
   3  done boolean;
   4  begin
   5  devtype:=sys.dbms_backup_restore.deviceallocate(type=>'',ident=>'t1');
   6  sys.dbms_backup_restore.restoresetarchivedlog(destination=>'D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09');
   7  sys.dbms_backup_restore.restorearchivedlog(thread=>1,sequence=>74);
   8  sys.dbms_backup_restore.restorebackuppiece(done=>done,handle=>'D:/oracle/product/10.2.0/db_1/database/ARCH_21_1_729276880',params=>null);
   9  sys.dbms_backup_restore.devicedeallocate;
  10  end;
  11  /
 
 PL/SQL procedure successfully completed.
 
 SQL>
 SQL> declare
   2  devtype varchar2(256);
   3  done boolean;
   4  begin
   5  devtype:=sys.dbms_backup_restore.deviceallocate(type=>'',ident=>'t1');
   6  sys.dbms_backup_restore.restoresetarchivedlog(destination=>'D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09');
   7  sys.dbms_backup_restore.restorearchivedlog(thread=>1,sequence=>75);
   8  sys.dbms_backup_restore.restorebackuppiece(done=>done,handle=>'D:/oracle/product/10.2.0/db_1/database/ARCH_21_1_729276880',params=>null);
   9  sys.dbms_backup_restore.devicedeallocate;
  10  end;
  11  /
 
 PL/SQL procedure successfully completed.
 
 SQL>
 SQL>
 SQL>
 SQL>
 SQL> recover database using backup controlfile;
 ORA-00279: change 1239644 generated at 09/09/2010 16:54:38 needed for thread 1
 ORA-00289: suggestion :
 D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_
 1_75_%U_.ARC
 ORA-00280: change 1239644 for thread 1 is in sequence #75
 
 
 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
 D:/oracle/product/10.2.0/flash_recovery_area/ORA10G/ARCHIVELOG/2010_09_09/0727003661_001_00075.ARC
 ORA-00279: change 1239656 generated at 09/09/2010 16:54:39 needed for thread 1
 ORA-00289: suggestion :
 D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_
 1_76_%U_.ARC
 ORA-00280: change 1239656 for thread 1 is in sequence #76
 ORA-00278: log file
 'D:/oracle/product/10.2.0/flash_recovery_area/ORA10G/ARCHIVELOG/2010_09_09/07270
 03661_001_00075.ARC' no longer needed for this recovery
 
 
 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
 
 ORA-00308: cannot open archived log
 'D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF
 _1_76_%U_.ARC'
 ORA-27041: unable to open file
 OSD-04002: ??????
 O/S-Error: (OS 2) The system cannot find the file specified.
 
 
 SQL>
 SQL>
 SQL>
 SQL> alter database open resetlogs;
 alter database open resetlogs
 *
 ERROR at line 1:
 ORA-01113: file 1 needs media recovery
 ORA-01110: data file 1: 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/SYSTEM01.DBF'
 
 
 SQL>
 SQL> recover database;
 ORA-00283: recovery session canceled due to errors
 ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
 
 
 SQL> recover database using backup controlfile until cancel;
 ORA-00279: change 1239656 generated at 09/09/2010 16:54:39 needed for thread 1
 ORA-00289: suggestion :
 D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_
 1_76_%U_.ARC
 ORA-00280: change 1239656 for thread 1 is in sequence #76
 
 
 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
 cancel;
 ORA-00308: cannot open archived log 'cancel;'
 ORA-27041: unable to open file
 OSD-04002: ??????
 O/S-Error: (OS 2) The system cannot find the file specified.
 
 
 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
 cancel
 Media recovery cancelled.
 SQL> alter database open resetlogs;
 
 Database altered.
 
 SQL>
 SQL>
 SQL>
 SQL>
 SQL> select count(*) from test.t1;
 
   COUNT(*)
 ----------
       1024
 
 SQL>--我们看到还原到crash前未commit的状态。

原文地址:https://www.cnblogs.com/weaver1/p/2491022.html