Oracle Rman の dbms_backup_restore

来源:互联网 发布:淘宝联盟推广方法 编辑:程序博客网 时间:2024/06/07 01:08

之前看文章,说建议数据库用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):

SQLl
  
1select count(*) from t1
SQL> /
 
  
COUNT(*)
--------
--
      1024

 
SQL>
SQL>
SQL>
SQLinsert into t1 select * from t1;
 
1024 rows created.
 
SQL> /
 
2048 rows created.
 
SQL> /
 
4096 rows created.
 
SQLselect count(*) from t1;
 
  
COUNT(*)
--------
--
      8192

 
SQL>
SQL>--commit前数据为1024行,insert8192行,但是未commit
SQLhost
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
 
C:/Documents and Settings/Administrator>rman target /
 
Recovery ManagerRelease 10.2.0.1.0 - Production on Thu Sep 9 16:53:31 2010
 
Copyright (c) 19822005Oracle.  All rights reserved.
 
connected to target databaseORA10G (DBID=4045875789)
 
RMANrun {
2allocate channel c1 type disk;
3backup
4>      incremental level=0
5>  filesperset 5
6>      format 'df_%s_%p_%t'
7>      (database);
8>  sql 'alter system archive log current';
9release channel c1;
10>  }
 
using target database control file instead of recovery catalog
allocated channelc1
channel c1sid=146 devtype=DISK
 
Starting backup at 09-SEP-10
channel c1starting incremental level 0 datafile backupset
channel c1specifying 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 c1starting piece 1 at 09-SEP-10
channel c1finished 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 c1backup set completeelapsed time00:00:50
channel c1starting incremental level 0 datafile backupset
channel c1specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel c1starting piece 1 at 09-SEP-10
channel c1finished 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 c1backup set completeelapsed time00:00:03
Finished backup at 09-SEP-10
 
sql statementalter system archive log current
 
released channelc1
 
RMAN>
 
RMANrun {
2>      allocate channel c1 type disk;
3>      backup
4>              filesperset 20
5>         format 'arch_%s_%p_%t'
6>         (archivelog all delete input);
7>    }
 
allocated channelc1
channel c1sid=146 devtype=DISK
 
Starting backup at 09-SEP-10
current log archived
channel c1starting archive log backupset
channel c1specifying 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 c1starting piece 1 at 09-SEP-10
channel c1finished 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 c1backup set completeelapsed time00:00:02
channel c1deleting 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 channelc1
 
RMAN>
 
RMANrun {
2>      allocate channel c1 type disk;
3>      backup
4>              filesperset 20
5>         format 'ctrl_%s_%p_%t'
6>         current controlfile;
7>    }
 
allocated channelc1
channel c1sid=146 devtype=DISK
 
Starting backup at 09-SEP-10
channel c1starting full datafile backupset
channel c1specifying datafile(s) in backupset
including current control file in backupset
channel c1starting piece 1 at 09-SEP-10
channel c1finished 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 c1backup set completeelapsed time00:00:02
Finished backup at 09-SEP-10
released channelc1
 
RMAN>
 
RMAN>--备份全库,arch文件,控制文件。其实后面我们可以从全库备份或者控制文件备份还原的,但是这里我们不演示用这种方式还原,我们用dbms_backup_restore包来做还原
 
RMANexit
 
 
Recovery Manager complete.
 
C:/Documents and Settings/Administrator>exit
 
SQL>
 
SQL>
SQL>
SQLconn / as sysdba
Connected.
SQL>
SQL>
SQL>
SQLshutdown abort
ORACLE instance shut down.
SQL>
SQL>
SQL>
SQLexit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the PartitioningOracle Label SecurityOLAP 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*PlusRelease 10.2.0.1.0 - Production on Thu Sep 9 17:20:29 2010
 
Copyright (c) 19822005Oracle.  All rights reserved.
 
Connected to an idle instance.
SQLstartup 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数据文件:
SQLdeclare
  
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>--重建控制文件:
SQLCREATE 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>
SQLrecover database;
ORA-00283recovery session canceled due to errors
ORA-01610recovery using the BACKUP CONTROLFILE option must be done
 
 
SQLrecover database using backup controlfile;
ORA-00279change 1239559 generated at 09/09/2010 16:53:41 needed for thread 1
ORA-00289suggestion :
D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_
1_74_%U_.ARC
ORA-00280change 1239559 for thread 1 is in sequence #74
 
 
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
SQL> --需要74arch来做recover
SQL> --restore 74arch
SQLdeclare
  
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
SQLdeclare
  
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>
SQLrecover database using backup controlfile;
ORA-00279change 1239644 generated at 09/09/2010 16:54:38 needed for thread 1
ORA-00289suggestion :
D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_
1_75_%U_.ARC
ORA-00280change 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-00279change 1239656 generated at 09/09/2010 16:54:39 needed for thread 1
ORA-00289suggestion :
D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_
1_76_%U_.ARC
ORA-00280change 1239656 for thread 1 is in sequence #76
ORA-00278log 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-00308cannot open archived log
'D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF
_1_76_%U_.ARC
'
ORA-27041unable to open file
OSD-04002: ??????
O/S-Error(OS 2) The system cannot find the file specified.
 
 
SQL>
SQL>
SQL>
SQLalter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01113file 1 needs media recovery
ORA-01110data file 1'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORA10G/SYSTEM01.DBF'
 
 
SQL>
SQLrecover database;
ORA-00283recovery session canceled due to errors
ORA-01610recovery using the BACKUP CONTROLFILE option must be done
 
 
SQLrecover database using backup controlfile until cancel;
ORA-00279change 1239656 generated at 09/09/2010 16:54:39 needed for thread 1
ORA-00289suggestion :
D:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORA10G/ARCHIVELOG/2010_09_09/O1_MF_
1_76_%U_.ARC
ORA-00280change 1239656 for thread 1 is in sequence #76
 
 
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel;
ORA-00308cannot open archived log 'cancel;'
ORA-27041unable 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.
SQLalter database open resetlogs;
 
Database altered.
 
SQL>
SQL>
SQL>
SQL>
SQLselect count(*) from test.t1;
 
  
COUNT(*)
--------
--
      1024

 
SQL>--我们看到还原到crash前未commit的状态。

 

原创粉丝点击