RMAN恢复之使用dbms_backup_restore过程包的恢复

摘自:http://www.itpub.net/thread-439471-1-1.html

手工实验,利用RMAN备份,然后丢失数据库文件,控制文件情况下的恢复
环境:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production

D:>SQLPLUS /NOLOG
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 10月 19 16:25:09 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> CONNECT / AS SYSDBA
已连接。

SQL> SELECT * FROM MYTEST;
ROW_ID
----------
1
2
3
4
5
6
1
2
3
4
5
ROW_ID
----------
6

已选择12行。

SQL> DELETE FROM MYTEST;
已删除12行。
SQL> COMMIT;
提交完成。
SQL> EXIT

从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

D:>RMAN
恢复管理器: 版本9.2.0.1.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
RMAN> CONNECT TARGET /
连接到目标数据库: MYDB (DBID=2486673107)
RMAN> SHOW ALL;
正在使用目标数据库控制文件替代恢复目录
RMAN 配置参数为:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'E:ORACLE_HOMEDATABASESNCFMYDB.ORA'; # default

--备份数据库,包括归档日志
RMAN> RUN
2> {
3> SQL'ALTER SYSTEM ARCHIVE LOG CURRENT';
4> ALLOCATE CHANNEL C1 DEVICE TYPE DISK FORMAT 'D:ORACLE_BASERman_Backupmydb_df_bck%U';
5> BACKUP DATABASE;
6> SQL'ALTER SYSTEM ARCHIVE LOG CURRENT';
7> BACKUP ARCHIVELOG ALL DELETE INPUT FORMAT 'D:ORACLE_BASERman_Backupmydb_log_bck%U';
8> }
sql 语句: ALTER SYSTEM ARCHIVE LOG CURRENT
分配的通道: C1
通道 C1: sid=12 devtype=DISK
启动 backup 于 19-10月-05
通道 C1: 正在启动 full 数据文件备份集
通道 C1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=D:ORACLE_BASEDATAFILESSYSTEM01.DBF
输入数据文件 fno=00002 name=D:ORACLE_BASEDATAFILESUNDOTBS.DBF
输入数据文件 fno=00003 name=D:ORACLE_BASEDATAFILESMYSPACE.DBF
通道 C1: 正在启动段 1 于 19-10月-05
通道 C1: 已完成段 1 于 19-10月-05
段 handle=D:ORACLE_BASERMAN_BACKUPMYDB_DF_BCK0CH1JGMH_1_1 comment=NONE
通道 C1: 备份集已完成, 经过时间:00:00:27
完成 backup 于 19-10月-05
sql 语句: ALTER SYSTEM ARCHIVE LOG CURRENT
启动 backup 于 19-10月-05
当前日志已存档
通道 C1: 正在启动存档日志备份集
通道 C1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =1 记录 ID=29 时间戳=572113616
输入存档日志线程 =1 序列 =2 记录 ID=30 时间戳=572113644
输入存档日志线程 =1 序列 =3 记录 ID=31 时间戳=572113644
通道 C1: 正在启动段 1 于 19-10月-05
通道 C1: 已完成段 1 于 19-10月-05
段 handle=D:ORACLE_BASERMAN_BACKUPMYDB_LOG_BCK0DH1JGND_1_1 comment=NONE
通道 C1: 备份集已完成, 经过时间:00:00:02
通道 C1: 正在删除存档日志
存档日志文件名 =D:ORACLE_BASEACHIVEARC00001.001 记录 ID=29 时间戳 =572113616
存档日志文件名 =D:ORACLE_BASEACHIVEARC00002.001 记录 ID=30 时间戳 =572113644
存档日志文件名 =D:ORACLE_BASEACHIVEARC00003.001 记录 ID=31 时间戳 =572113644
完成 backup 于 19-10月-05
释放的通道: C1
RMAN> EXIT
恢复管理器完成。

D:>SQLPLUS /NOLOG
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 10月 19 16:27:42 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> CONNECT / AS SYSDBA
已连接。
SQL> SELECT * FROM MYTEST;
未选定行
SQL> INSERT INTO MYTEST VALUES(1);
已创建 1 行。
SQL> INSERT INTO MYTEST VALUES(2);
已创建 1 行。
SQL> INSERT INTO MYTEST VALUES(3);
已创建 1 行。
SQL> COMMIT;
提交完成。

SQL> SHUTDOWN ABORT;
ORACLE 例程已经关闭。
SQL> STARTUP;
ORACLE 例程已经启动。

Total System Global Area 529604068
bytes
Fixed Size 454116
bytes
Variable Size 318767104
bytes
Database Buffers 209715200
bytes
Redo Buffers 667648
bytes
数据库装载完毕。
数据库已经打开。

SQL> INSERT INTO MYTEST VALUES(4);
已创建 1 行。
SQL> INSERT INTO MYTEST VALUES(5);
已创建 1 行。
SQL> INSERT INTO MYTEST VALUES(6);
已创建 1 行。
SQL> COMMIT;
提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> SHUTDOWN ABORT;
ORACLE 例程已经关闭。
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

--删除所有控制文件,数据文件(临时文件没有删除)


D:>sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 10月 19 16:33:46 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> connect / as sysdba
已连接到空闲例程。
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area 529604068
bytes
Fixed Size 454116
bytes
Variable Size 318767104
bytes
Database Buffers 209715200
bytes
Redo Buffers 667648
bytes

--利用脚本从备份片中直接恢复数据文件
SQL> DECLARE
2 devtype varchar2(256);
3 done boolean;
4 BEGIN
5 devtype:=sys.dbms_backup_restore.DeviceAllocate (type => '',ident => 'FUCK');
6 dbms_backup_restore.RestoreSetDatafile;
7 dbms_backup_restore.RestoreDatafileTo(dfnumber => 1,toname => 'D:ORACLE_BASEdatafilesSYSTEM01.DBF');
8 dbms_backup_restore.RestoreDatafileTo(dfnumber => 2,toname => 'D:ORACLE_BASEdatafilesUNDOTBS.DBF');
9 dbms_backup_restore.RestoreDatafileTo(dfnumber => 3,toname => 'D:ORACLE_BASEdatafilesMYSPACE.DBF');
10 dbms_backup_restore.RestoreBackupPiece(done => done,handle => 'D:ORACLE_BASERMAN_BACKUPMYDB_DF_BCK0CH1JGMH_1_1', params => null);
11 dbms_backup_restore.DeviceDeallocate;
12 END;
13 /
PL/SQL 过程已成功完成。

--手工创建控制文件
SQL> CREATE CONTROLFILE REUSE DATABASE "MYDB" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 5
3 MAXLOGMEMBERS 5
4 MAXDATAFILES 100
5 MAXINSTANCES 1
6 MAXLOGHISTORY 226
7 LOGFILE
8 GROUP 1 'D:ORACLE_BASEREDO_LOGREDO01.LOG' SIZE 100M,
9 GROUP 2 'D:ORACLE_BASEREDO_LOGREDO02.LOG' SIZE 100M,
10 GROUP 3 'D:ORACLE_BASEREDO_LOGREDO03.LOG' SIZE 100M
11 DATAFILE
12 'D:ORACLE_BASEDATAFILESSYSTEM01.DBF',
13 'D:ORACLE_BASEDATAFILESUNDOTBS.DBF',
14 'D:ORACLE_BASEDATAFILESMYSPACE.DBF'
15 CHARACTER SET UTF8
16 ;
控制文件已创建

--打开数据库,肯定不成功
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'D:ORACLE_BASEDATAFILESSYSTEM01.DBF'

--recover数据库,但归档不连续,因为备份归档时自动删除,现在还在备份片中没恢复过来
SQL> recover database;
ORA-00279: ?? 123423 (? 10/19/2005 16:26:59 ??) ???? 1 ????
ORA-00289: ??: D:ORACLE_BASEACHIVEARC00002.001
ORA-00280: ?? 123423 ???? 1 ???? # 2 ???


指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: ???????? 'D:ORACLE_BASEACHIVEARC00002.001'
ORA-27041: ??????
OSD-04002: N^7(4r?*NDO/S-Error: (OS 2) O5M3UR2;5=V86(5DND

ORA-00308: ???????? 'D:ORACLE_BASEACHIVEARC00002.001'
ORA-27041: ??????
OSD-04002: N^7(4r?*NDO/S-Error: (OS 2) O5M3UR2;5=V86(5DND
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

--使用RMAN进行归档恢复,然后RECOVER数据库,结果新建控制文件中不包含归档信息,没法restore archivelog
D:>rman
恢复管理器: 版本9.2.0.1.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
RMAN> connect target /
连接到目标数据库: MYDB (DBID=2486673107)
RMAN> recover database;
启动 recover 于 19-10月-05
正在使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=11 devtype=DISK
正在开始介质的恢复
无法找到存档日志
存档日志线程 =1 序列=2
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 10/19/2005 16:37:57
RMAN-06054: media recovery requesting unknown log: thread 1 scn 123423

RMAN> restore archivelog all;
启动 restore 于 19-10月-05
使用通道 ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 10/19/2005 16:40:09
RMAN-20242: specification does not match any archive log in the recovery catalog

--从metalink上问到归档日志的恢复脚本
SQL> DECLARE
2 devtype varchar2(256);
3 done boolean;
4 BEGIN
5 devtype := dbms_backup_restore.DeviceAllocate (type => '',ident => 'FUCK');
6 dbms_backup_restore.RestoreSetArchivedLog(destination=>'D:ORACLE_BASEachive');
7 dbms_backup_restore.RestoreArchivedLog(thread=>1,sequence=>1);
8 dbms_backup_restore.RestoreArchivedLog(thread=>1,sequence=>2);
9 dbms_backup_restore.RestoreArchivedLog(thread=>1,sequence=>3);
10 dbms_backup_restore.RestoreBackupPiece(done => done,handle => 'D:ORACLE_BASERMAN_BACKUPMYDB_LOG_BCK0DH1JGND_
1_1', params => null);
11 dbms_backup_restore.DeviceDeallocate;
12 END;
13 /

PL/SQL 过程已成功完成。

具体,dbms_backup_restore的语法可以参考 $ORACLE_HOME/rdbms/admin/dbmsbkrs.sql 里的注释
--*********************************************
-- Restore Conversation Initiation Procedures--
--********************************************-- 部分。


5 devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'sbt_tape',ident=>'T1',params=>'ENV=(NB_ORA_CLIENT=node2,NB_ORA_SERV=nub-server)');
说明:类似rman的分配通道


6 sys.dbms_backup_restore.restoreSetArchivedLog;
PROCEDURE restoreSetArchivedLog(destination IN varchar2 default NULL);
是否转换文件恢复位置,用了默认值,就是no。


7 sys.dbms_backup_restore.restoreArchivedLogRange;
PROCEDURE restoreArchivedLogRange(
low_change IN number default 0
,high_change IN number default 281474976710655 );
这里都用了默认值,0-281474976710655。


8 sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'arch_1117116731_660845286_16_1');
PROCEDURE restoreBackupPiece( handle IN varchar2
,done OUT boolean
,params IN varchar2 default NULL
,fromdisk IN boolean default FALSE );
handle就是备份集名称。


9 sys.dbms_backup_restore.deviceDeallocate;
释放通道


//



--归档已经手工从备份片中恢复,剩下的就是recover了
SQL> RECOVER DATABASE;
ORA-00283: 恢复会话因错误而取消
ORA-01610: 使用 BACKUP CONTROLFILE 选项的恢复必须已完成


SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA-00279: 更改 123423 (在 10/19/2005 16:26:59 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00002.001
ORA-00280: 更改 123423 对于线程 1 是按序列 # 2 进行的


指定日志: {=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00279: 更改 123434 (在 10/19/2005 16:27:24 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00003.001
ORA-00280: 更改 123434 对于线程 1 是按序列 # 3 进行的
ORA-00278: 此恢复不再需要日志文件 'D:ORACLE_BASEACHIVEARC00002.001'


ORA-00279: 更改 123437 (在 10/19/2005 16:27:24 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00004.001
ORA-00280: 更改 123437 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'D:ORACLE_BASEACHIVEARC00003.001'


ORA-00279: 更改 143456 (在 10/19/2005 16:28:40 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00005.001
ORA-00280: 更改 143456 对于线程 1 是按序列 # 5 进行的
ORA-00278: 此恢复不再需要日志文件 'D:ORACLE_BASEACHIVEARC00004.001'


ORA-00279: 更改 143581 (在 10/19/2005 16:29:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00006.001
ORA-00280: 更改 143581 对于线程 1 是按序列 # 6 进行的
ORA-00278: 此恢复不再需要日志文件 'D:ORACLE_BASEACHIVEARC00005.001'


ORA-00279: 更改 143583 (在 10/19/2005 16:29:19 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00007.001
ORA-00280: 更改 143583 对于线程 1 是按序列 # 7 进行的
ORA-00278: 此恢复不再需要日志文件 'D:ORACLE_BASEACHIVEARC00006.001'


ORA-00279: 更改 143586 (在 10/19/2005 16:29:25 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00008.001
ORA-00280: 更改 143586 对于线程 1 是按序列 # 8 进行的
ORA-00278: 此恢复不再需要日志文件 'D:ORACLE_BASEACHIVEARC00007.001'


ORA-00279: 更改 143588 (在 10/19/2005 16:29:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00009.001
ORA-00280: 更改 143588 对于线程 1 是按序列 # 9 进行的
ORA-00278: 此恢复不再需要日志文件 'D:ORACLE_BASEACHIVEARC00008.001'


ORA-00279: 更改 143590 (在 10/19/2005 16:29:27 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00010.001
ORA-00280: 更改 143590 对于线程 1 是按序列 # 10 进行的
ORA-00278: 此恢复不再需要日志文件 'D:ORACLE_BASEACHIVEARC00009.001'


ORA-00308: 无法打开存档日志 'D:ORACLE_BASEACHIVEARC00010.001'
ORA-27041: 无法打开文件
OSD-04002: Ξ?????????
O/S-Error: (OS 2) ????????????????


SQL> ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE OPEN RESETLOGS
*
ERROR 位于第 1 行:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'D:ORACLE_BASEDATAFILESSYSTEM01.DBF'


SQL> recover datafile 1;
ORA-00283: 恢复会话因错误而取消
ORA-01610: 使用 BACKUP CONTROLFILE 选项的恢复必须已完成


SQL> recover database using backup controlfile;
ORA-00279: 更改 143590 (在 10/19/2005 16:29:27 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00010.001
ORA-00280: 更改 143590 对于线程 1 是按序列 # 10 进行的


指定日志: {=suggested | filename | AUTO | CANCEL}
D:ORACLE_BASEachiveARC00001.001
ORA-00310: 存档日志包含序列 1;要求序列 10
ORA-00334: 归档日志: 'D:ORACLE_BASEACHIVEARC00001.001'


SQL> recover database using backup controlfile;
ORA-00279: 更改 143590 (在 10/19/2005 16:29:27 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00010.001
ORA-00280: 更改 143590 对于线程 1 是按序列 # 10 进行的


指定日志: {=suggested | filename | AUTO | CANCEL}
D:ORACLE_BASEredo_logREDO01.LOG
ORA-00310: 存档日志包含序列 8;要求序列 10
ORA-00334: 归档日志: 'D:ORACLE_BASEREDO_LOGREDO01.LOG'


SQL> recover database using backup controlfile;
ORA-00279: 更改 143590 (在 10/19/2005 16:29:27 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLE_BASEACHIVEARC00010.001
ORA-00280: 更改 143590 对于线程 1 是按序列 # 10 进行的


指定日志: {=suggested | filename | AUTO | CANCEL}
D:ORACLE_BASEredo_logREDO02.LOG
已应用的日志。
完成介质恢复。
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项


SQL> alter database open resetlogs;

数据库已更改。

SQL> select * from mytest;

ROW_ID
----------
5
6
1
2
3
4

已选择6行。

至此恢复过程结束,大家可以看到整个过程是非常烦琐的,因为我故意在恢复过程中没有使用控制文件,而是
手工的用dbms_backup_restore存储包来做(备份片中其实包含了控制文件,可以恢复过来,不需要手工建立),
如果数据库本身文件比较多,归档日志也很多的话,这样你要提供文件号,日志序列号是比较发疯的,虽然用
SQL生成语句可以实现,但出错了就不大好了,使用RMAN备份,因为他不是物理的COPY文件,而是以他自己的
格式写入备份片,将关键信息记录在控制文件中,所以要想保证顺利恢复,就要确保控制文件的安全,做好他
的备份。
Oracle的备份恢复体系确实很强大,我觉得采取合理,安全的备份策略是很重要的,作为DBA没必要把自己推到
悬崖边,玩一些高难度的动作来扮英雄,这些动作应该只在测试库或别人的数据库出现,自己管理的生产库是绝
对不允许出现这些情况的,否则就是是备份策略的失败,是你DBA的失败!!!

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23862439/viewspace-1058036/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23862439/viewspace-1058036/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值