摘自: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的失败!!!
|