数据库恢复
====================
rman备份信息可以使用catalog库存放,如果不配置catalog库则只能使用控制文件进行替代,所以控制文件在数据库备份中的重要性比较高。
避免控制文件丢失可以设置控制文件自动备份,也可以在脚本中单独备份控制文件,另外全库备份中叶包含控制文件,版本较高的rdbms还能在回复区中找到控制文件的镜像,以上方式都找不到控制文件则只能手动创建控制文件
一旦手动重新创建,控制文件中的备份信息也就丢失,这是就需要是用dbms_backup_restore包进行恢复
通过包dbms_backup_restore,在不是用catalog库或者控制文件的情况下仍然可以从备份集中读取数据库文件,做到数据恢复
如下测试及为数据文件、控制文件,在线日志文件,归档日志文件都丢失,只有rman备份的情况下数据库的恢复
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
备份集
D:\oracle\product\10.2.0\flash_recovery_area\AN10\BACKUPSET\2008_04_10\O1_MF_NNNDF_TAG20080410T100316_3ZTXC5PY_.BKP
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 209715200 bytes
Fixed Size 1248116 bytes
Variable Size 71304332 bytes
Database Buffers 130023424 bytes
Redo Buffers 7139328 bytes
通过脚本恢复数据文件
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,
8 toname=>'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\SYSTEM01.DBF');
9 sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>02,
10 toname=>'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\UNDOTBS01.DBF');
11 sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>03,
12 toname=>'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\SYSAUX01.DBF');
13 sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>04,
14 toname=>'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\USERS01.DBF');
15 sys.dbms_backup_restore.restoreBackupPiece(done=>done,
16 handle=>'D:\oracle\product\10.2.0\flash_recovery_area\AN10\BACKUPSET\2008_0
4_10\O1_MF_NNNDF_TAG20080410T100316_3ZTXC5PY_.BKP',params=>null);
17 sys.dbms_backup_restore.deviceDeallocate;
18 end;
19 /
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> CREATE CONTROLFILE REUSE DATABASE "AN10" NORESETLOGS 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\AN10\REDO01.LOG' SIZE 5M,
9 GROUP 2 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\REDO02.LOG' SIZE 5M,
10 GROUP 3 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\REDO03.LOG' SIZE 5M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\SYSTEM01.DBF',
14 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\UNDOTBS01.DBF',
15 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\SYSAUX01.DBF',
16 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\USERS01.DBF'
17 -- 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\AN.DBF'
18 CHARACTER SET ZHS16GBK
19 ;
CREATE CONTROLFILE REUSE DATABASE "AN10" NORESETLOGS ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: ????????????
O/S-Error: (OS 2) ??????????????????????
找不到redo日志,这时手动建立适合大小的redo,并再次创建控制文件
SQL> /
Control file created.
由于临时表空间不进行备份,所以恢复的时候需要重新建立临时表空间
但必须是在数据库打开的情况下
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\T
EMP01.DBF'
2 SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\TEMP01
.DBF'
*
ERROR at line 1:
ORA-01109: database not open
SQL> recover database using backup controlfile until cancle;
ORA-00277: illegal option to the UNTIL recovery flag CANCLE
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 292666 generated at 04/10/2008 10:03:17 needed for thread 1
ORA-00289: suggestion :
D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\AN10\ARCHIVELOG\2008_04_10\O1_MF_1_
221_%U_.ARC
ORA-00280: change 292666 for thread 1 is in sequence #221
Specify log: {
auto
ORA-00308: cannot open archived log
'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\AN10\ARCHIVELOG\2008_04_10\O1_MF_1
_221_%U_.ARC'
ORA-27041: unable to open file
OSD-04002: ????????????
O/S-Error: (OS 2) ??????????????????????
ORA-00308: cannot open archived log
'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\AN10\ARCHIVELOG\2008_04_10\O1_MF_1
_221_%U_.ARC'
ORA-27041: unable to open file
OSD-04002: ????????????
O/S-Error: (OS 2) ??????????????????????
SQL>
SQL>
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open resetlogs;
Database altered.
SQL>
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\AN10\TEMP01.DBF' SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
Tablespace altered.
这样就把数据库恢复。
---------------------------
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13177610/viewspace-676332/ ,如需转载,请注明出处,否则将追究法律责任。