ORACLE 常见故障恢复

一.非归档模式的数据库,丢失数据文件

l故障现象
Ø丢失某个数据库文件,造成了数据库无法启动,同时数据库处于非归档模式,也没有冷备份,启动时的错误信息如下:
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: 'D:\ORACLE\ORADATA\TEST\USERS01.DBF'
l解决方法
Ø将数据库启动到mount状态下:
Øsqlplus “/ as sysdba”
Østartup mount
Ø从数据库中删除该数据文件
Øalter database datafile ‘xx’ offline drop;
Ø打开数据库
Øalter database open;
Ø备注:
Ø该方法可正常打开数据库,但该datafile中的数据将丢失
Ø如果误删除了system表空间的datafile,则该方法不奏效
Ø如果该表空间还包含其它数据文件,用EXP把数据备份出来,然后删除表空间,重建表空间,将数据导入。如果不包含其它数据文件,则直接删除表空间就可以了。

二.归档模式数据库丢失某数据文件,无备份,但有该数据文件创建以来的归档日志

l故障现象
Ø归档模式的数据库,丢失了某个数据库文件,造成了数据库无法启动,同时没有数据库的全备份,但有该数据文件创建以来的归档日志,数据库无法启动:
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: 'D:\ORACLE\ORADATA\TEST\USERS01.DBF
l解决方法
Ø启动数据库到mount状态
Østartup mount
Ø手工创建丢失的数据文件
Øalter database create datafile ‘oldfname’ as  ‘newfname’size xxx reuse;
Ø利用归档日志对数据文件进行恢复
Ørecover datafile ‘newfname’;或者
Ørecover datafile  n;
Ø打开数据库
Øalter database open;
Ø备注:
Ø该方法可正常打开数据库,而且不会丢失数据
Ø该方法有两个前提
Ø丢失的数据文件不能是系统文件
Ø不能丢失或损坏控制文件

三.非current和active的redo log损坏

l故障现象
Ø误删除了redo log,或者redo log被损坏,数据库能mount,不能open:
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/oracle10/oradata/ora10g/redo03.log'
l解决方法
Ø查询v$log视图,确认损坏的redo log group是非current和active
ØSQL>select group#,thread#,sequence#, archived,status from v$log;
GROUP#  THREAD#  SEQUENCE#  ARCHIVED STATUS
------       -------          ----------            --------           --------
1                1                103                  YES      INACTIVE
2                1                104                  NO       CURRENT
3                1                102                  YES      INACTIVE
Ø如果该日志已经归档,用下面的命令清除日志内容
ØAlter database clear logfile group 3;
Ø如果该日志没有归档,用下面的命令清除日志内容
ØAlter database clear unarchived logfile group 3;
Ø打开数据库
ØAlter database open;
Ø尽快做一个数据库全备份

四.current或active的redo log损坏

l故障现象
Ø误删除了redo log,或者redo log被损坏,数据库不能打开:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/oracle10/oradata/ora10g/redo02.log'
l解决方法
Ø查询v$log视图,确认损坏的redo log group是current或active
ØSQL>select group#,thread#,sequence#, archived,status from v$log;
GROUP#  THREAD#  SEQUENCE#  ARCHIVED STATUS
------       -------          ----------            --------           --------
1                1                    2                      YES      INACTIVE
2                1                    4                      NO       CURRENT
3                1                    3                      YES      INACTIVE
Ø情况1:当前日志文件还存在,只是逻辑损坏,并且当前日志没有未决事务需要实例恢复
Øalter database clear unarchived logfile group 2;  --不会报错
Ørecover database until cancel;
Øalter database open resetlogs;
Ø一般情况下,该方法不奏效,如果clear报错,则用其它方法.
Ø情况2:当前日志完全损坏,且有未决事务,数据库有备份
Øalter database clear unarchived logfile group 2;  --会报错
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
Ørestore database;
Ørecover database until cancel; --选择auto
Ørecover database until cancel;
Øalter datbase open resetlogs;
Ø尽快做一个数据库全备份
Ø情况3:当前日志完全损坏,且有未决事务,数据库无备份
Øshutdown immediate;
Ø_allow_resetlogs_corruption=true;
Østartup mount pfile=‘xxx’;
Ørecover database until cancel;
Øalter datbase open resetlogs;
Øshutdown immediate
Ø_allow_resetlogs_corruption=true;
ØStartup
Ø尽快做一个数据库全备份

五.临时表空间的数据文件损坏

l故障现象
Ø临时表空间的数据文件发生损坏,系统出现故障,如何恢复
l解决方法
Ø在10g及以上版本数据库,启动数据库时,如果发现临时数据文件损坏,会自动创建,如果在数据库运行过程中,可以手工重建:
Øcreate temporary tablespace temp1 tempfile ‘xx’ size xx’;
Øalter database default temporary tablespace temp1;--系统默认临时表空间的重建需要执行这一步,否则不需要
Ødrop tablespace temp;
Øalter tablespace temp1 rename to temp;
Ø在10g以前版本数据库,可以在数据库打开后或运行过程中,手工重建就可以了
Øalter database datafile ‘xxx’ offline drop;--如果数据库打不开,就执行这个步骤
Øcreate temporary tablespace temp1 tempfile ‘xx’ size xx’;
Øalter database default temporary tablespace temp1;--系统默认临时表空间的重建需要执行这一步 ,否则不需要,9i以前版本也不需要。
Ødrop tablespace temp;
Øalter tablespace temp1 rename to temp;

六.UNDO数据文件损坏,数据库无法启动

l故障现象
ØUndo数据文件发生了丢失或损坏,数据库启动报错:
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2: '/oracle10/oradata/ora10g/undotbs01.dbf'
l解决方法
Ø如果数据库有备份,则利用备份进行恢复
Ø如果数据库没有备份,则利用重建undo表空间的方式进行恢复
Østartup mount
Øalter database datafile n offline drop;(删除损坏的undo文件)
Øalter database open;
Øcreate undo tablespace xxx …; (创建一个新的undo表空间)
Øalter system set undo_tablespace=xxx;(指向新的undo表空间)
Ødrop tablespace yyy including contents;(删除原来的undo表空间)

七.控制文件损坏

l故障现象
Ø控制文件发生了损坏,数据库已经无法启动,报错信息如下:
ORA-00202: controlfile: 'D:\Oracle\oradata\chen\control01.ctl'
ORA-27041: unable to open file
OSD-04002: unable to open file
l解决方法
Ø情况一:控制文件有镜像,且镜像控制文件没有被损坏
Ø关闭数据库
Ø将没有损坏的控制文件覆盖掉损坏的控制文件,或者修改参数文件的control_files参数,去掉损坏的控制文件
Ø重新启动数据库

Ø情况二:控制文件无镜像,或者镜像的所有控制文件都损坏了
Ø恢复控制文件
Ø如果控制文件有备份,从备份中恢复控制文件
restore controlfile from ‘’
Ø如果控制文件有snapshot,将snapshot控制文件替换掉原损坏控制文件
Ø如果做过alter database backup controlfile to trace的控制文件脚本备份,可以用trace文件中的重建脚本来创建控制文件,
Ø如果没有备份,也没有trace备份,只能手工编写脚本创建控制文件,前提是你对数据库文件结构非常清楚
Ø恢复和打开数据库
Ø如果是用create controlfile …noresetlogs 方式重建的控制文件
Ørecover database;
Øalter database open;
Øalter tablespace temp add tempfile ‘xx’ size xx reuse ; --对所有临时表空间做此操作
Ø如果是用create controlfile …resetlogs方式重建的控制文件,或者通过备份或快照恢复的控制文件
Ørecover database using backup controlfile;
Øalter database open resetlogs;
Øalter tablespace temp add tempfile ‘xx’ size xx reuse ; --对所有临时表空间做此操作

菊子曰  写博客,就用 菊子曰!

你可能感兴趣的:(ORACLE 常见故障恢复)