ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle不同文件丢失/损坏的恢复方法

Oracle不同文件丢失/损坏的恢复方法

原创 Linux操作系统 作者:keeptrying 时间:2013-11-13 17:15:00 0 删除 编辑

一、SPFILE丢失

步骤:

RMAN> startup nomount;

RMAN> set dbid 1354067853;

RMAN> restore spfile from autobackup;

或者通过某个文件:

RMAN> restore spfile from ‘path/file_name’;

RMAN> shutdown immediate;

set dbid 1354067853;

startup;

测试:

SQL> startup        --删除SPFILE后,数据库打不开,报错

ORA-01078: failure in processing system parameters

LRM-00109: ???????????????? 'E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\INITSORCL.ORA'

C:\Users\Administrator>rman target /   --使用RMAN

恢复管理器: Release 10.2.0.3.0 - Production on 星期三 11 13 09:38:35 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

已连接到目标数据库 (未启动)

RMAN> startup nomount;  --使用RMAN在无SPFILE下启动到nomount

启动失败: ORA-01078: failure in processing system parameters

LRM-00109: ???????????????? 'E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\INITSORCL.ORA'

在没有参数文件的情况下启动 Oracle 实例以检索 spfile

Oracle 实例已启动

系统全局区域总计     159383552 字节

Fixed Size                     1289436 字节

Variable Size                 58721060 字节

Database Buffers              92274688 字节

Redo Buffers                   7098368 字节

RMAN> set dbid 1354067853;     --设置DBID

正在执行命令: SET DBID

RMAN> restore spfile from autobackup;

启动 restore 13-11-13

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131113

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131112

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131111

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131110

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131109

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131108

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131107

通道 ORA_DISK_1: 没有找到 7 天之内的自动备份

--没有自动备份

RMAN> restore spfile from 'E:\oracle\product\10.2.0\flash_recovery_area\ORCL\BACKUPSET\2013_11_13\O1

_MF_NCSNF_TAG20131113T092124_985O1HY9_.BKP';

启动 restore 13-11-13

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 已找到的自动备份: E:\oracle\product\10.2.0\flash_recovery_area\ORCL\BACKUPSET\2013_

11_13\O1_MF_NCSNF_TAG20131113T092124_985O1HY9_.BKP

通道 ORA_DISK_1: 从自动备份复原 SPFILE 已完成

完成 restore 13-11-13

--从指定备份文件中恢复

RMAN> shutdown immediate;

Oracle 实例已关闭

SQL> startup             --启动数据库

ORACLE 例程已经启动。

Total System Global Area  377487360 bytes

Fixed Size                  1290688 bytes

Variable Size             339742272 bytes

Database Buffers           29360128 bytes

Redo Buffers                7094272 bytes

数据库装载完毕。

数据库已经打开。

二、Controlfile全部丢失

步骤:

RMAN> set dbid 1354067853;

RMAN> startup nomount;

RMAN> restore controlfile from autobackup;

或者从指定文件恢复:

RMAN> restore controlfile from ‘path/file_name’;

RMAN> alter database mount;

RMAN> recover database;(保证数据一致,因为控制文件里scn发生改变)

RMAN> alter database open resetlogs;

测试:

SQL> startup;                 --启动数据库报错

ORACLE instance started.

Total System Global Area  377487360 bytes

Fixed Size                  1290688 bytes

Variable Size             356519488 bytes

Database Buffers           12582912 bytes

Redo Buffers                7094272 bytes

ORA-00205: error in identifying control file, check alert log for more info

SQL> select status from v$instance;

STATUS

------------

STARTED                 

SQL> select * from v$database;

select * from v$database

              *

ERROR at line 1:

ORA-01507: database not mounted

SQL> shutdown abort;

ORACLE instance shut down.

C:\Users\Administrator>rman target /       --使用RMAN

恢复管理器: Release 10.2.0.3.0 - Production on 星期三 11 13 10:47:59 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

已连接到目标数据库 (未启动)

RMAN> set dbid 1354067853;         --设置DBID

正在执行命令: SET DBID

RMAN> startup nomount;              --启动至nomount

Oracle 实例已启动

系统全局区域总计     377487360 字节

Fixed Size                     1290688 字节

Variable Size                360713792 字节

Database Buffers               8388608 字节

Redo Buffers                   7094272 字节

RMAN> restore controlfile from autobackup;

启动 restore 13-11-13

使用目标数据库控制文件替代恢复目录

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=157 devtype=DISK

恢复区域目标: E:\oracle\product\10.2.0\flash_recovery_area

用于搜索的数据库名 (或数据库的唯一名称): ORCL

通道 ORA_DISK_1: 在恢复区域中未找到自动备份

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131113

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131112

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131111

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131110

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131109

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131108

通道 ORA_DISK_1: 寻找以下日期的自动备份: 20131107

通道 ORA_DISK_1: 没有找到 7 天之内的自动备份

--没有自动备份

RMAN> restore controlfile from 'E:\oracle\product\10.2.0\flash_recovery_area\ORCL\BACKUPSET\2013_11_

13\O1_MF_NCSNF_TAG20131113T092124_985O1HY9_.BKP';

启动 restore 13-11-13

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在复原控制文件

通道 ORA_DISK_1: 恢复完成, 用时: 00:00:03

输出文件名=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROLFILE\O1_MF_985T8O42_.CTL

输出文件名=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\CONTROLFILE\O1_MF_985T8OHP_.CTL

完成 restore 13-11-13

--使用指定的备份文件恢复

RMAN> alter database mount;           --mount数据库

数据库已装载

释放的通道: ORA_DISK_1

RMAN> recover database;                --恢复数据库

启动 recover 13-11-13

启动 implicit crosscheck backup 13-11-13

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=156 devtype=DISK

已交叉检验的 1 对象

完成 implicit crosscheck backup 13-11-13

启动 implicit crosscheck copy 13-11-13

使用通道 ORA_DISK_1

完成 implicit crosscheck copy 13-11-13

搜索恢复区域中的所有文件

正在编制文件目录...

目录编制完毕

已列入目录的文件的列表

=======================

文件名: E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2013_11_13\O1_MF_NCSNF_TAG201311

13T092124_985O1HY9_.BKP

使用通道 ORA_DISK_1

正在开始介质的恢复

存档日志线程 1 序列 3 已作为文件 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_3

_93F18M64_.LOG 存在于磁盘上

存档日志文件名 =E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_3_93F18M64_.LOG 线

=1 序列 =3

介质恢复完成, 用时: 00:00:02

完成 recover 13-11-13

RMAN> alter database open resetlogs;    --resetlogs打开

数据库已打开

三、Redo Log File损坏

1Current Online Redo损坏

这种情况在之前的文章中介绍过:

http://space.itpub.net/25744374/viewspace-776419/

这里再写一下步骤:

1)、如果有归档和备份,可以用不完全恢复

SQL> startup mount;

SQL> recover database until cancel;先选择auto,尽量恢复可以利用的归档日志,然后重新执行:

SQL> recover database until cancel;这次输入cancel,完成不完全恢复,用resetlogs打开数据库:

SQL> alter database open resetlogs;

2)、强制恢复,这种方法可能会导致数据不一致

SQL> startup mount;

SQL> alter system set “_allow_resetlogs_corruption”=true scope=spfile;

SQL> recover database until cancel;

SQL> alter database open resetlogs;

由于使用该方式打开会造成数据的丢失,且数据库的状态不一致,因此,这种情况下oracle建议通过exp方式导出数据库,重建新数据库后,再导入。

2、非Current损坏

这种情况下的恢复比较简单,因为redo log是已经完成归档或者正在归档,没有正在使用,可以通过v$log查看redo log的状态。

1)、如果statusinactive,则表示已经完成了归档,直接清除掉这个redo log即可。

SQL> startup mount;

SQL> alter database clear logfile group 3;

SQL> alter database open;

测试:

SQL> select group#,sequence#,bytes,members,archived,status from v$log;

    GROUP#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---

         1          2   52428800          2 YES ACTIVE

         2          3   52428800          2 NO  CURRENT

         3          1   52428800          2 YES INACTIVE

--当前INACTIVE状态的redogroup3

SQL> shutdown immediate;  --关闭数据库,手工修改破坏group3日志

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup                    --数据库启动报错

ORACLE instance started.

Total System Global Area  377487360 bytes

Fixed Size                  1290688 bytes

Variable Size             352325184 bytes

Database Buffers           16777216 bytes

Redo Buffers                7094272 bytes

Database mounted.

ORA-00313: open failed for members of log group 3 of thread 1

ORA-00312: online log 3 thread 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_3_93F18LGH_

.LOG'

ORA-00312: online log 3 thread 1: 'E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF

_3_93F18M64_.LOG'

--根据提示的错误,可以看出是group 3日志的问题,查看一下:

SQL> select group#,sequence#,bytes,members,archived,status from v$log;

    GROUP#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

---------- ---------- ---------- ---------- --- ----

         1          2   52428800          2 YES INACTIVE

         3          1   52428800          2 YES INACTIVE

         2          3   52428800          2 NO  CURRENT

SQL> alter database clear logfile group 3;

Database altered.          --清除日志组3

SQL> alter database open;       --打开数据库

Database altered.

2)、如果statusACTIVE状态,表示正在归档,此时需要使用如下语句:

SQL> startup mount;

SQL> alter database clear unarchived logfile group 3;

SQL> alter database open;

四、非系统表空间损坏

若出现介质故障导致某表空间不可用,恢复可以在数据库处于openmount状态下进行,步骤如下:

1.将该表空间至于offline状态;

2.修复表空间数据;

3.恢复表空间并处于一致性;

4.将表空间online.

RMAN> sql ‘alter tablespace ts1 offline’;

如果文件不存在,就加immediate参数:

RMAN> sql ‘alter tablespace ts1 offline immediate’;

RMAN> restore tablespace ts1;

RMAN> recover tablespace ts1;

RMAN> sql ‘alter tablespace ts1 online’;

五、数据文件损坏

如果出现介质故障导致某表空间数据文件丢失(这种情况也可以参照表空间损坏的恢复),恢复可以在数据库处于openmount状态下进行:步骤如下:

1.将数据文件置于offline状态;

2.修复数据文件(指定数据文件编号);

3.修复数据文件;

4.将数据文件online.

RMAN> sql ‘alter datafile 5 offline’;

RMAN> restore datafile 5;

RMAN> recover datafile 5;

RMAN> sql ‘alter datafile 5 online’;

测试:

SQL> startup

ORACLE instance started.

Total System Global Area  377487360 bytes

Fixed Size                  1290688 bytes

Variable Size             352325184 bytes

Database Buffers           16777216 bytes

Redo Buffers                7094272 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 5 - see DBWR trace file

ORA-01110: data file 5: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\TS01.DBF'

--手工修改了表空间ts1的数据文件,数据库打开时报错

RMAN> restore datafile 5;        --restore数据文件

启动 restore 13-11-13

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=155 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集

通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件

正将数据文件00005恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\TS01.DBF

通道 ORA_DISK_1: 正在读取备份段 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2013_11_

13\O1_MF_NNNDF_TAG20131113T134432_9864G11O_.BKP

通道 ORA_DISK_1: 已恢复备份段 1

段句柄 = E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2013_11_13\O1_MF_NNNDF_TAG20131

113T134432_9864G11O_.BKP 标记 = TAG20131113T134432

通道 ORA_DISK_1: 恢复完成, 用时: 00:00:05

完成 restore 13-11-13

RMAN> recover datafile 5;       --recover数据文件

启动 recover 13-11-13

使用通道 ORA_DISK_1

正在开始介质的恢复

介质恢复完成, 用时: 00:00:03

完成 recover 13-11-13

SQL> alter database open;         --启动数据库

Database altered.

六、基于时间点/SCN/日志序列的不完全恢

基于时间点/SCN/日志序列的不完全恢复,可以将数据库、表空间、数据文件等恢复至恢复备份集保存时间点中的任何一个时间点/SCN/日志序列,但须谨慎,操作前一定需要做好备份,具备条件的情况下最好先恢复到异机。

1、基于时间点

run{

      set until time “to_date(‘11/13/13 13:00:00’,’mm/dd/yy hh24:mi:ss’)”;

      restore database;

      recover database;

      alter database open resetlogs;

    }

-------------------------------------------------

SQL> startup nomount;

SQL> alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’;

SQL> recover database until time ‘2013-11-13 13:10:00’;

SQL> alter database open resetlogs;

-------------------------------------------------

SQL> startup mount;

SQL> recover database until time “to_date(‘2013-11-13 13:10:00’,’YYYY-MM-DD HH24:MI:SS’)”;

SQL> alter database open resetlogs;

2、基于SCN

RMAN> startup mount;

RMAN> restore database until scn 10000;

RMAN> recover database until scn 10000;

RMAN> alter database open resetlogs;

3、基于日志序列

RMAN> startup mount;

RMAN> restore database until SEQUENCE 100 thread 1;

      //100是日志序列

RMAN> recover database until SEQUENCE 100 thread 1;

RMAN> alter database open resetlogs;

七、catalog下完全恢复

RMAN> startup nomount;

RMAN> restore controlfile from autobackup;

RMAN> alter database mount;

RMAN> restore database;

RMAN> recover database;

RMAN> alter database open resetlogs;

测试:

--删除全部数据文件、控制文件

C:\Users\Administrator>rman target /

恢复管理器: Release 10.2.0.3.0 - Production on 星期三 11 13 16:46:40 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

已连接到目标数据库 (未启动)

RMAN> startup nomount;

Oracle 实例已启动

系统全局区域总计     377487360 字节

Fixed Size                     1290688 字节

Variable Size                352325184 字节

Database Buffers              16777216 字节

Redo Buffers                   7094272 字节

--restore控制文件

RMAN> restore controlfile from 'E:\oracle\product\10.2.0\flash_recovery_area\ORCL\BACKUPSET\2013_11_

13\O1_MF_NCSNF_TAG20131113T163801_986GN47H_.BKP';

启动 restore 13-11-13

使用目标数据库控制文件替代恢复目录

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=157 devtype=DISK

通道 ORA_DISK_1: 正在复原控制文件

通道 ORA_DISK_1: 恢复完成, 用时: 00:00:01

输出文件名=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROLFILE\O1_MF_986H53FG_.CTL

输出文件名=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\CONTROLFILE\O1_MF_986H53RV_.CTL

完成 restore 13-11-13

RMAN> alter database mount;       --mount数据库

数据库已装载

释放的通道: ORA_DISK_1

RMAN> recover database;           --恢复数据库

启动 recover 13-11-13

使用通道 ORA_DISK_1

正在开始介质的恢复

存档日志线程 1 序列 1 已作为文件 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_1

_93F18H07_.LOG 存在于磁盘上

存档日志文件名 =E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_1_93F18H07_.LOG 线

=1 序列 =1

介质恢复完成, 用时: 00:00:03

完成 recover 13-11-13

RMAN> alter database open resetlogs;

数据库已打开

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

请登录后发表评论 登录
全部评论

注册时间:2011-04-25

  • 博文量
    130
  • 访问量
    935224