oracle数据库各种故障恢复案例

来源:互联网 发布:个体营业执照查询软件 编辑:程序博客网 时间:2024/04/29 21:51

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

各种故障恢复案例

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

1、 SPFILE 丢失

startup nomount; 
set dbid 3988862108; 
restore spfile from autobackup;
或者通过某个文件

restore spfile from 'path/file_name'';

shutdown immediate;

set dbid 3988862108;

startup; 

2、controlfile 全部丢失

控制文件做了 3个冗余,很少会发生全部丢失的情况,当遇到控制文件所有都丢失,恢复需要以下步骤 :

 RMAN>set dbid 3988862108;
 RMAN>startup nomount; 
 RMAN>restore controlfile from autobackup;
或从文件恢复

RMAN>restore controlfile from ‘file_name ';
 RMAN>alter database mount;
 RMAN>recover database;(保证数据一致,因为控制文件里 scn scn发生改变)
 RMAN>alter database open resetlogs;

resetlogs命令表示一个数据库逻辑生存期 的结束和另命令表示一个数据库逻辑生存期 的结束和另的开始,每次使用 resetlogs命令的时候,SCN不会被重置,不过 oracle 会重置 日志序列号,而且会重置联机做内容 日志序列号,而且会重置联机做内容 . 这样做是为了防止不完全恢复后日 志序列会发生冲突(因为现有日和数据文件间了时差)。

3、UNDO 损坏的情况

出现这种情况, 大多数是因为异常宕机,在启动的时候报错误。 DB 不能启动:

比如: ORA -00600: internal error code, arguments: [4194]
对于 Undo 损坏的情况,能用备份恢复最好如果不就只通过一些特的方发来恢复:

方法一 : 使用 system segment
(1)用 spfile 创建 pfile ,然后修改参数:
#*.undo_tablespace='UNDOTBS1' 
#*.undo_management='AUTO' 
#*. undo_tablespace
#*.undo_retention
undo_management='MANUAL'
rollback_segments='SYSTEM' 
(2)用修改之后的 pfile,重启 DB
SQL> STARTUP MOUNT pfile= 'F:\initorcl.ora' ;
(3)删除原来的 表空间,创建新UNDO 表空间
SQL> drop tablespace undotbs;
SQL> create undo tablespace undotbs1 datafile '' '/u01/oradatau01/undotbs1.dbf' 'size 10M;
(4)关闭数据库,修改 pfile参数,然后用新的 pfile创建 spfile ,在正常启动数 据库。
*.undo_tablespace='UNDOTBS1' 
*.undo_management='AUTO' 
#undo_management='MANUAL'
#rollback_segments='SYSTEM' 
方法二 :跳过损坏的 segment

在方法一里面,我们使用了segment segment,undo segment 有多个,我们可 以通过  alert log 来查看正在使用的是哪些 segment ,这些段有可能损坏了。 我 们只需要把这些损坏的 segment  跳过,先正常启动 DB ,在创建新的 UNDO 表 空间,在切换一下。

(1)修改 pfile pfile pfile,添加参数:
*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$' 
这些字段的值, 我们通过 alert log  查看。 也可以通过如下命令查看:
#strings system01.db f | grep _SYSSMU | cut -d $ -f 1 | sort f 1 | sort -u
(2)用修改之后的 pfile 启动 DB
因为跳过了那些损坏的 segment ,所以 DB 可以正常启动。

(3)创建新的UNDO表空间,并切换过来:

SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;
SQL> alter system set undo_tablespace=undotbs1;

 SQL> drop tablespace undotbs;

(4)修改 pfile,创建 spfile ,并正常启动
删除:
*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'
以上就是 UNDO 出现的 2种故障的处理方法。

4、Redo log file 损坏

重做日志文件在数据库中是要求最高的 组,首先其对磁盘IO 要求极高, 其次一旦  CURRENT 组发生故障,数据库会立即崩溃并且 组发生故障,100% 会发生数据丢 失,所以 ORAC LE 建议至少每个组需要两成员,并且在数据库运行过程中日 志文件会一直被锁定,以防不测。
Redo log 的恢复分为两种 CURRENT 和 非 CURRENT

一、 CURRENT 情况
造成 redo redo 损坏,很多情况是与突然断电有关, 这种下比较麻烦的。
(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;

这里主要看 2点:
(1)使用了 _allow_resetlogs_corruption 参数

(2)这种情况下,可能会报  ORA -600[2662] (SCN有关)和 ORA -600[4000](回 滚段有关)的错误。
使用 _allow_resetlogs_corruption参数,强制打开据库可能会导致逻辑 的坏块,从而影响数据字典。 所以,即使使用该参数正常打开后也需要做的 一个操作:逻辑导出数据。 重建实例,导入实例,消除逻辑坏块的可能性。

运气好的话, 数据库 能正常打开, 如果使用 _allow_resetlogs_corruption 参数 启动报了 undo segment 的错误而无法启动,处理方参考 2.5.3 节中 undo 的处 理情况。
但是由于使用 _allow_resetlogs_corruption 方式打开,会造成数据的丢失且 数据库的状态不一致。因此,这种情况下Oracle 建议通过 EXP 方式导出数据库。 重建数据库后再导入。

二、非current 情况

这种情况下的恢复比较简单,因为 redo log 是已经完成归档或者正在归档,没有正在使用。可以通过 v$log查看 redo log  的状态。
(1)如果 STATUS 是 INACTIVE 则表示已经完成了归档,直接清除掉这个 redo  log 即可。
SQL>startup mount;
SQL> alter database clear logfile group 3 ; 
SQL>alter database open;
(2)如果 STATUS是 ACTIVE ,表 示正在归档, 此时需要使用如下语句:
SQL>startup mount;
SQL> alter database clear unarchived logfile group 3 ; 
SQL>alter database open;

5、非系统表空间损坏

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

1. 将该表空间置于 offline offline 状态
2. 修复表空间数据
3. 恢复表空间并处于一致性
4. 将表空间 online 
 rman> sql 'alter tablespace  xxx  offline';
如果文件不存在,就加 immediate参数
rman> sql 'alter tablespace xxx offline immediate';
rman>restore tablespace rman>restore tablespace rman>restore tablespace rman>restore tablespace rman>restore tablespace rman>restore tablespace rman>restore tablespace xxx;
rman>sql 'alter tablespace xxx online';

6、数据文件损坏

如果出现介质故障导致某表空间 数据文件丢失(这种情况也可以参照表空间损坏的恢 复) 。
恢复可以在 数据库处于 open或 mount  状态下进行,只需 4个步骤
1. 将该数据文件置于 offline  状态
2. 修复数据文件(指定编号)
3. 恢复数据文件
4. 将数据文件 online 
rman> sql 'alter datafile 8 offline ';
rman>restore datafile 8;
rman>recovery datafile  8;
rman>sql 'alter datafile 8 online';

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

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

(1) 基于时间点
run{
 set until time "to_date(12 /29 /10 23 :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 '20 10 -12 -29 23:19:00';
SQL>ALTER DATABASE OPEN RESETLOGS;
ALTER SESSION SET NLS_DATE_FORMAT='YYYY -MM -DD HH24:MI:SS';
SQL>startup mount;
SQL>restore database until time "to_date('2010 -12 -29 23:19:00','YYYY -MM -DD HH24:MI:SS')";
SQL>recover database until time "to_date('20 recover database until time "to_date('20recover database until time "to_date('20 recover database until time "to_date('20recover database until time "to_date(‘2010 -12 -29 23:19:00','YYYY-MM -DD DD HH24:MI:SS')";
SQL>alter database open resetlogs;

(2)基于scn

SQL>startup mount; 
SQL>restore database until scn 10000; 

SQL>recover database until scn 10000;
SQL>alter database open resetlogs;

(3)基于日志序列

SQL>startup mount; 
SQL>restore database until SEQUENCE 100 thread 1; //100是日志序列
SQL>recover database until SEQUENCE 100 thread 1;
SQL>alter database open resetlogs;
日志序列查看命令:
SQL>select sequence from v$log;

resetlogs就会把 sequence置为 1

8、非catalog下完全恢复

SQL>startup nomount; 
SQL>restore controlfile from autobackup; 
SQL>alter database mount;
SQL>restore database;
SQL>recover database; 
SQL>alter database open resetlogs;
示例 :
oracle ora10g> rm *;
oracle ora10g> ls; 
oracle ora10g> //  数据文件,控制全部删除
oracle ora10g> rman target  //因为 controlfile 丢失,不能够连接到 rman 

oracle ora10g> sqlplus /nolog; 
oracle ora10g> conn /as sysdba;
oracle ora10g> shutdown abort; 
oracle ora10g> rman target /
rman> startup nomount; 
rman> restore controlfile from autabackup;
rman> alter database mount; 
rman> restore database;
rman> recover database; //online redolog 不存在
SQL>recover database until cancel; // 当 redo log丢失,数据库在缺省的方式下是 不容许进行 recover 操作的,那么如何在这种情况下操作呢?
SQL>create pfile from spfile;
vi /u01/product/10.20/dbs/initora10g.ora 在这个文件的最后一行添加 
*.allow_resetlogs_corruption='TRUE'; //容许 resetlog corruption 
SQL>shutdown immediate;
SQL>startup pfile='/u01/product/10.20/dbs/initora10g.ora' mount;
SQL>alter database open resetlogs;


0 0