oracle 数据文件丢失 恢复,丢失数据文件,控制文件的RMAN恢复

手工实验,利用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的失败!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值