首页 > 数据库 > Oracle > rman无控制文件的数据恢复
昨天晚上接到单位某部门同事的紧急求助电话,说某www数据库别另一同事不小心rm -rf了,听到这首先安慰他不着急,慢慢来,询问了数据库的备份情况后,首先我心定了下来,感觉应该可以恢复。但是当我真正操作的时候发现问题来了,就只有一个数据库的rman全备份,而且控制文件的自动备份也在rm -rf过程中一起消失了。有点悲剧了。呵呵,在此仔细查看了下rman的恢复方法,终于在浩瀚的网络中找到了解答,原来oracle在9i中为了防止rman的备份信息无法注册到控制文件中而使数据无法恢复,可通过dbms_backup_restore来进行数据文件的抽取恢复,故有了下面的测试,下面测试绝对ok了,有什么不懂得可以留言,也可qq我啊,呵呵。
QQ:570833708
1、做rman全库备份在目录/u/rman/Gwwwbak/2下
rman target /
backup database format '/u/rman/Gwwwbak/%T_%d_%s_%p';-----------完成后删除原来的数据文件以及redo文件,开始我们的测试,此处我们假设我们的该rman备份的控制文件同时也被删除了。若控制文件开启了自动备份,可直接干掉自动备份目录,呵呵,方便快捷,若不放心可如下删除控制文件即可。
RMAN> delete backup of controlfile;
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=146 devtype=DISK
List of Backup Pieces
BP Key BS Key Pc# Cp# Status Device Type Piece Name
------- ------- --- --- ----------- ----------- ----------
1 1 1 1 AVAILABLE DISK /u/rman/Gwwwbak/20140211_GWWW_2_1
Do you really want to delete the above objects (enter YES or NO)? yes
deleted backup piece
backup piece handle=/u/rman/Gwwwbak/20140211_GWWW_2_1 recid=1 stamp=839259830
Deleted 1 objects
rman备份日志中文件记录信息,注意此处需要的信息时fno号及文件位置名称name,用于后期文件抽取:
input datafile fno=00001 name=/u/app/oracle/oradata/Gwww/system01.dbf
input datafile fno=00003 name=/u/app/oracle/oradata/Gwww/sysaux01.dbf
input datafile fno=00005 name=/u/app/oracle/oradata/Gwww/example01.dbf
input datafile fno=00002 name=/u/app/oracle/oradata/Gwww/undotbs01.dbf
input datafile fno=00004 name=/u/app/oracle/oradata/Gwww/users01.dbf
2、首先用新创建的spfile启动数据库到nomount状态下(pfile的创建想必不用再多说了吧)。
startup force nomount;
3、在不使用控制文件的情况下,抽取rman备份中的数据文件(控制文件也可通过同样的方法抽取):
DECLARE
v_handle VARCHAR2 (500);
v_is_done BOOLEAN := FALSE;
TYPE t_input_files IS TABLE OF VARCHAR2 (1000)
INDEX BY BINARY_INTEGER;
v_max_backup_pieces NUMBER := 2;
v_input_files t_input_files;
BEGIN
v_input_files (1) := '/u/rman/Gwwwbak/20140211_GWWW_1_1';
v_input_files (2) := '/u/rman/Gwwwbak/20140211_GWWW_2_1';
v_max_backup_pieces := 2;
v_handle := SYS.DBMS_BACKUP_RESTORE.DEVICEALLOCATE;
SYS.DBMS_BACKUP_RESTORE.RESTORESETDATAFILE;
sys.dbms_backup_restore.restoredatafileto(dfnumber=>01,toname=>'/u/app/oracle/oradata/Gwww/system01.dbf');
sys.dbms_backup_restore.restoredatafileto(dfnumber=>02,toname=>'/u/app/oracle/oradata/Gwww/undotbs01.dbf');
sys.dbms_backup_restore.restoredatafileto(dfnumber=>03,toname=>'/u/app/oracle/oradata/Gwww/sysaux01.dbf');
sys.dbms_backup_restore.restoredatafileto(dfnumber=>04,toname=>'/u/app/oracle/oradata/Gwww/users01.dbf');
sys.dbms_backup_restore.restoredatafileto(dfnumber=>05,toname=>'/u/app/oracle/oradata/Gwww/example01.dbf');
FOR i IN 1 .. v_max_backup_pieces
LOOP
DBMS_OUTPUT.PUT_LINE('Restoring piece '|| to_char(i) || ' from backup file: ' || v_input_files(i)
||'...');
SYS.DBMS_BACKUP_RESTORE.RESTOREBACKUPPIECE (done=> v_is_done,handle=> v_input_files(i),params=> NULL);
IF v_is_done
THEN
GOTO all_done;
END IF;
END LOOP;
<
SYS.DBMS_BACKUP_RESTORE.devicedeallocate;
END;
/
上述执行可能需要一段时间,之后可在相应的位置看到数据文件已经恢复了。接下来就解决控制文件问题。
4、创建控制文件,根据数据文件的位置创建相关控制文件,注意此处的redo文件以及字符集。
CREATE CONTROLFILE REUSE DATABASE "GWWW" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u/app/oracle/oradata/Gwww/redo01.log' SIZE 50M,
GROUP 2 '/u/app/oracle/oradata/Gwww/redo02.log' SIZE 50M,
GROUP 3 '/u/app/oracle/oradata/Gwww/redo03.log' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'/u/app/oracle/oradata/Gwww/system01.dbf',
'/u/app/oracle/oradata/Gwww/undotbs01.dbf',
'/u/app/oracle/oradata/Gwww/sysaux01.dbf',
'/u/app/oracle/oradata/Gwww/users01.dbf',
'/u/app/oracle/oradata/Gwww/example01.dbf'
CHARACTER SET ZHS16GBK
;
5、创建完控制文件后,此时数据库应该处于mounted状态,可以通过rman catalog方式注册archivelog到控制文件中。然后进行
database的recover,或者此时可以直接open rsetlogs 数据库即可。视需要而定。
此处我的测试就直接resetlogs了。呵呵
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13725567/viewspace-1079834/ ,如需转载,请注明出处,否则将追究法律责任。