DBMS_BACKUP_RESTORE可用于特殊情况下的恢复
在controlfile故障时,可以利用它进恢复数据文件,DBMS_BACKUP_RESTORE可在nomount状态下进行恢复操作。
Oracle提供了一个包:DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE 包是由dbmsbkrs.sql 和 prvtbkrs.plb 这两个脚本创建的.catproc.sql 脚本运行后会调用这两个包.所以是每个数据库都有的这个包是Oracle服务器和操作系统之间IO操作的接口.由恢复管理器直接调用。而且据说这两个脚本的功能是内建到Oracle的一些库文件中的.
由此可见,我们可以在数据库 nomount 情况下调用这些package ,来达到我们的恢复目的。在dbmsbkrs.sql 和prvtbkrs.plb 这两个脚本中有详细的说明文档
DECLARE
devtype
varchar2
(
256
);
done
boolean
;
BEGIN
--分配一个设备通道,如果使用的操作系统文件,type就为空,如果是从磁带上恢复要用 "sbt_tape"
devtype:=sys.dbms_backup_restore.deviceAllocate(
type
=>
''
,ident=>
't1'
);
--表示开始恢复
;
sys.dbms_backup_restore.restoreSetDatafile;
--指定恢复文件的目标位置
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>
01
,toname=>
'D:\ORADATA\HUI99DB\SYSTEM01.DBF'
);
--指定备份集的位置
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>
'F:\rmanbackup\HUI99DB_FULL_0_3367236198_20100808_S90_P1.RBAK'
, params=>
null
);
--释放通道
sys.dbms_backup_restore.deviceDeallocate;
END
;
/
--Include the current SPFILE in the backup set.
exec
dbms_backup_restore.backupspfile
;
--
恢复参数文件,如果指定
sfname
还可以恢成
spfile
;
--
需要在
nomount
状态下恢复,可以先启动到
DUMMY
;
--
或者自建一个
pfile
,只要在文件里设置
db_name
即可启动实例到
nomount
状态
(
默认情况可能出现
ORA-04031
错误,最好在
pfile
里将
shared_pool_size
设置大一点的值
)
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.RESTORESPFILETO(pfname=>
'C:\oracle\product\10.2.0\admin\hui99db\pfile\pfile.ora'
);
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>
'F:\rmanbackup\HUI99DB_FULL_0_3367236198_20100808_S91_P1.RBAK'
, 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.restorecontrolfileto(sfname=>
'D:\ORADATA\HUI99DB\controlfile01.ora'
);
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>
'F:\rmanbackup\HUI99DB_FULL_0_3367236198_20100808_S91_P1.RBAK'
, params=>
null
);
sys.dbms_backup_restore.deviceDeallocate;
END
;
/
--
恢复
0
级备份语句
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=>
'D:\ORADATA\HUI99DB\SYSTEM01.DBF'
);
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>
02
,toname=>
'D:\ORADATA\HUI99DB\UNDOTBS01.DBF'
);
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>
03
,toname=>
'D:\ORADATA\HUI99DB\SYSAUX01.DBF'
);
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>
04
,toname=>
'D:\ORADATA\HUI99DB\USERS01.DBF'
);
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>
05
,toname=>
'D:\ORADATA\HUI99DB\MALLTEST.DBF'
);
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>
06
,toname=>
'D:\ORADATA\HUI99DB\MALLTESTPART.DBF'
);
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>
07
,toname=>
'D:\ORADATA\HUI99DB\MALLTESTIDX.DBF'
);
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>
08
,toname=>
'D:\ORADATA\HUI99DB\MALLIDXSPACE.DBF'
);
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>
09
,toname=>
'D:\ORADATA\HUI99DB\MALLPARTSPACE.DBF'
);
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>
10
,toname=>
'D:\ORADATA\HUI99DB\MALLSPACE.DBF'
);
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>
'F:\rmanbackup\HUI99DB_FULL_0_3367236198_20100808_S90_P1.RBAK'
, 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.applySetDatafile;
sys.dbms_backup_restore.applyDatafileTo(dfnumber=>
01
,toname=>
'D:\ORADATA\HUI99DB\SYSTEM01.DBF'
);
sys.dbms_backup_restore.applyDatafileTo(dfnumber=>
02
,toname=>
'D:\ORADATA\HUI99DB\UNDOTBS01.DBF'
);
sys.dbms_backup_restore.applyDatafileTo(dfnumber=>
03
,toname=>
'D:\ORADATA\HUI99DB\SYSAUX01.DBF'
);
sys.dbms_backup_restore.applyDatafileTo(dfnumber=>
04
,toname=>
'D:\ORADATA\HUI99DB\USERS01.DBF'
);
sys.dbms_backup_restore.applyDatafileTo(dfnumber=>
05
,toname=>
'D:\ORADATA\HUI99DB\MALLTEST.DBF'
);
sys.dbms_backup_restore.applyDatafileTo(dfnumber=>
06
,toname=>
'D:\ORADATA\HUI99DB\MALLTESTPART.DBF'
);
sys.dbms_backup_restore.applyDatafileTo(dfnumber=>
07
,toname=>
'D:\ORADATA\HUI99DB\MALLTESTIDX.DBF'
);
sys.dbms_backup_restore.applyDatafileTo(dfnumber=>
08
,toname=>
'D:\ORADATA\HUI99DB\MALLIDXSPACE.DBF'
);
sys.dbms_backup_restore.applyDatafileTo(dfnumber=>
09
,toname=>
'D:\ORADATA\HUI99DB\MALLPARTSPACE.DBF'
);
sys.dbms_backup_restore.applyDatafileTo(dfnumber=>
10
,toname=>
'D:\ORADATA\HUI99DB\MALLSPACE.DBF'
);
sys.dbms_backup_restore.applyBackupPiece(done=>done,handle=>
'F:\rmanbackup\HUI99DB_DIF_2_3367236198_20100809_S94_P1.RBAK'
, 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.restoreSetArchivedLog;
sys.dbms_backup_restore.restoreArchivedLog(
thread
=>
1
,
sequence
=>
107
);
/* sys.dbms_backup_restore.RESTOREARCHIVEDLOGRANGE(low_change=>0,high_change=>);*/
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>
'F:\rmanbackup\HUI99DB_ARC_12_3367236198_20100810_S96_P1.RBAK'
, params=>
null
);
sys.dbms_backup_restore.deviceDeallocate;
END
;
/
全库的恢复
Recover database using backup controlfile until cancel;
打开数据库
Alter database open resetlogs;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9932141/viewspace-677384/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9932141/viewspace-677384/