手工实验,利用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_HOME\DATABASE\SNCFMYDB.ORA'; # default
--备份数据库,包括归档日志
RMAN> RUN
2> {
3> SQL'ALTER SYSTEM ARCHIVE LOG CURRENT';
4> ALLOCATE CHANNEL C1 DEVICE TYPE DISK FORMAT 'D:\ORACLE_BASE\Rman_Backup\mydb_df_bck%U';
5> BACKUP DATABASE;
6> SQL'ALTER SYSTEM ARCHIVE LOG CURRENT';
7> BACKUP ARCHIVELOG ALL DELETE INPUT FORMAT 'D:\ORACLE_BASE\Rman_Backup\mydb_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_BASE\DATAFILES\SYSTEM01.DBF
输入数据文件 fno=00002 name=D:\ORACLE_BASE\DATAFILES\UNDOTBS.DBF
输入数据文件 fno=00003 name=D:\ORACLE_BASE\DATAFILES\MYSPACE.DBF
通道 C1: 正在启动段 1 于 19-10月-05
通道 C1: 已完成段 1 于 19-10月-05
段 handle=D:\ORACLE_BASE\RMAN_BACKUP\MYDB_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_BASE\RMAN_BACKUP\MYDB_LOG_BCK0DH1JGND_1_1 comment=NONE
通道 C1: 备份集已完成, 经过时间:00:00:02
通道 C1: 正在删除存档日志
存档日志文件名 =D:\ORACLE_BASE\ACHIVE\ARC00001.001 记录 ID=29 时间戳 =572113616
存档日志文件名 =D:\ORACLE_BASE\ACHIVE\ARC00002.001 记录 ID=30 时间戳 =572113644
存档日志文件名 =D:\ORACLE_BASE\ACHIVE\ARC00003.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_BASE\datafiles\SYSTEM01.DBF');
8 dbms_backup_restore.RestoreDatafileTo(dfnumber => 2,toname => 'D:\ORACLE_BASE\datafiles\UNDOTBS.DBF');
9 dbms_backup_restore.RestoreDatafileTo(dfnumber => 3,toname => 'D:\ORACLE_BASE\datafiles\MYSPACE.DBF');
10 dbms_backup_restore.RestoreBackupPiece(done => done,handle => 'D:\ORACLE_BASE\RMAN_BACKUP\MYDB_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_BASE\REDO_LOG\REDO01.LOG' SIZE 100M,
9 GROUP 2 'D:\ORACLE_BASE\REDO_LOG\REDO02.LOG' SIZE 100M,
10 GROUP 3 'D:\ORACLE_BASE\REDO_LOG\REDO03.LOG' SIZE 100M
11 DATAFILE
12 'D:\ORACLE_BASE\DATAFILES\SYSTEM01.DBF',
13 'D:\ORACLE_BASE\DATAFILES\UNDOTBS.DBF',
14 'D:\ORACLE_BASE\DATAFILES\MYSPACE.DBF'
15 CHARACTER SET UTF8
16 ;
控制文件已创建
--打开数据库,肯定不成功
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'D:\ORACLE_BASE\DATAFILES\SYSTEM01.DBF'
--recover数据库,但归档不连续,因为备份归档时自动删除,现在还在备份片中没恢复过来
SQL> recover database;
ORA-00279: ?? 123423 (? 10/19/2005 16:26:59 ??) ???? 1 ????
ORA-00289: ??: D:\ORACLE_BASE\ACHIVE\ARC00002.001
ORA-00280: ?? 123423 ???? 1 ???? # 2 ???
指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: ???????? 'D:\ORACLE_BASE\ACHIVE\ARC00002.001'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND
ORA-00308: ???????? 'D:\ORACLE_BASE\ACHIVE\ARC00002.001'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND
O/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_BASE\achive\');
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_BASE\RMAN_BACKUP\MYDB_LOG_BCK0DH1JGND_
1_1', params => null);
11 dbms_backup_restore.DeviceDeallocate;
12 END;
13 /
PL/SQL 过程已成功完成。
--归档已经手工从备份片中恢复,剩下的就是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_BASE\ACHIVE\ARC00002.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_BASE\ACHIVE\ARC00003.001
ORA-00280: 更改 123434 对于线程 1 是按序列 # 3 进行的
ORA-00278: 此恢复不再需要日志文件 'D:\ORACLE_BASE\ACHIVE\ARC00002.001'
ORA-00279: 更改 123437 (在 10/19/2005 16:27:24 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE_BASE\ACHIVE\ARC00004.001
ORA-00280: 更改 123437 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'D:\ORACLE_BASE\ACHIVE\ARC00003.001'
ORA-00279: 更改 143456 (在 10/19/2005 16:28:40 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE_BASE\ACHIVE\ARC00005.001
ORA-00280: 更改 143456 对于线程 1 是按序列 # 5 进行的
ORA-00278: 此恢复不再需要日志文件 'D:\ORACLE_BASE\ACHIVE\ARC00004.001'
ORA-00279: 更改 143581 (在 10/19/2005 16:29:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE_BASE\ACHIVE\ARC00006.001
ORA-00280: 更改 143581 对于线程 1 是按序列 # 6 进行的
ORA-00278: 此恢复不再需要日志文件 'D:\ORACLE_BASE\ACHIVE\ARC00005.001'
ORA-00279: 更改 143583 (在 10/19/2005 16:29:19 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE_BASE\ACHIVE\ARC00007.001
ORA-00280: 更改 143583 对于线程 1 是按序列 # 7 进行的
ORA-00278: 此恢复不再需要日志文件 'D:\ORACLE_BASE\ACHIVE\ARC00006.001'
ORA-00279: 更改 143586 (在 10/19/2005 16:29:25 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE_BASE\ACHIVE\ARC00008.001
ORA-00280: 更改 143586 对于线程 1 是按序列 # 8 进行的
ORA-00278: 此恢复不再需要日志文件 'D:\ORACLE_BASE\ACHIVE\ARC00007.001'
ORA-00279: 更改 143588 (在 10/19/2005 16:29:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE_BASE\ACHIVE\ARC00009.001
ORA-00280: 更改 143588 对于线程 1 是按序列 # 9 进行的
ORA-00278: 此恢复不再需要日志文件 'D:\ORACLE_BASE\ACHIVE\ARC00008.001'
ORA-00279: 更改 143590 (在 10/19/2005 16:29:27 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE_BASE\ACHIVE\ARC00010.001
ORA-00280: 更改 143590 对于线程 1 是按序列 # 10 进行的
ORA-00278: 此恢复不再需要日志文件 'D:\ORACLE_BASE\ACHIVE\ARC00009.001'
ORA-00308: 无法打开存档日志 'D:\ORACLE_BASE\ACHIVE\ARC00010.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_BASE\DATAFILES\SYSTEM01.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_BASE\ACHIVE\ARC00010.001
ORA-00280: 更改 143590 对于线程 1 是按序列 # 10 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
D:\ORACLE_BASE\achive\ARC00001.001
ORA-00310: 存档日志包含序列 1;要求序列 10
ORA-00334: 归档日志: 'D:\ORACLE_BASE\ACHIVE\ARC00001.001'
SQL> recover database using backup controlfile;
ORA-00279: 更改 143590 (在 10/19/2005 16:29:27 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE_BASE\ACHIVE\ARC00010.001
ORA-00280: 更改 143590 对于线程 1 是按序列 # 10 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
D:\ORACLE_BASE\redo_log\REDO01.LOG
ORA-00310: 存档日志包含序列 8;要求序列 10
ORA-00334: 归档日志: 'D:\ORACLE_BASE\REDO_LOG\REDO01.LOG'
SQL> recover database using backup controlfile;
ORA-00279: 更改 143590 (在 10/19/2005 16:29:27 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE_BASE\ACHIVE\ARC00010.001
ORA-00280: 更改 143590 对于线程 1 是按序列 # 10 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
D:\ORACLE_BASE\redo_log\REDO02.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的失败!!!