oracle部分文件丢失故障处理

这个文件是同事整理的,很有参考价值

环境:rhl4 + oracle10.2,dbname=orcl

Oracle数据库的故障恢复

=============================1. pfile/spfile故障或丢失的处理============================

情况一、当pfile和spfile其中一个文件故障或丢失,别一个文件完好
先删除故障的文件
 cd $ORACLE_HOME/dbs
 rm –f  iniorcl.ora        删除pfile
或者
 rm –f spfileorcl.ora    删除spfile
如果spfile在ASM中存储,先将SID切换为+ASM
 export ORACLE_SID=+ASM
执行asmcmd命令进入到ASM中,删除spfile
   以SYSDBA身份登录数据库
sqlplus / as sysdba
重建spfile或pfile。
create spfile from pfile;
create pfile from spfile;
重启数据库使之生效
shutdown immediate;
startup;
由于运行期不锁定spfile,所以spfile可能会意外丢失,如果发生此类情况,Oracle会不允许使用create spfile from pfile缺省命令来重建spfile,通常可以创建一个自定义名称的spfile文件,然后重命名为缺省名称即可。
以SYSDBA身份登录数据库
sqlplus / as sysdba
创建一个自定义名称的spfile
create spfile =‘spfileaabb.ora’ from pfile;
exit
cd $ORACLE_HOME/dbs
重命名为缺省名称
mv spfileaabb.ora spfilecharge.ora
重启数据库,使之生效。
sqlplus / as sysdba
startup


情况二、当pfile和spfile同时故障或丢失时,如果spfile有备份,则可以通过备份将其恢复,再重建pfile文件。
如果有catalog恢复目录时,使用如下方法进行恢复:
以SYSDBA身份登录,并关闭数据库
sqlplus / as sysdba
shutdown immediate;
exit
连接目标数据和恢复目录数据库(注:rmansrv是恢复目录数据库的服务名)
rman target / catalog rman/rman@rmansrv
启动数据库到nomount状态
startup nomount;
从自动备份集中重载spfile文件
restore spfile to '+data/charge/spfilecharge.ora' from autobackup;
启动数据库到mount状态
startup mount;
打开数据库
alter database open;
exit
以SYSDBA身份登录
sqlplus / as sysdba
从spfile中创建pfile
create pfile from spfile;
重启数据库使之生效
shutdown immediate;
startup;
如果没有使用catalog恢复目录,但知道spfile备份文件位置及名称时,可以指定备份文件,用如下方法进行恢复:
 以SYSDBA身份登录,并关闭数据库
sqlplus / as sysdba
shutdown immediate;
exit
连接到目标数据库
rman target /
启动数据库到nomount状态
startup nomount;
从指定备份集中,重载spfile文件
restorespfileto'+data/charge/spfilecharge.ora'from /home/ora_bak/c-1055641976-20080612-00;
启动数据库到mount状态。
startup mount;
打开数据库
alter database open;
exit
以SYSDBA身份登录,并创建pfile文件。
sqlplus / as sysdba
create pfile from spfile;
重启数据库使之生效。
shutdown immediate;
startup;


情况三、当pfile和spfile同时故障或丢失时,且spfile没有备份,可以从其它服务器上拷贝一个pfile,然后修改pfile里面的一些配置参数,主要修改的配置有db_name、control_files等)。然后利用pfile启动数据库。最后再用修改好的pfile创建spfile。
我们可以通过SYSDBA登录数据库,用show parameter spfile;命令来查看数据库是否启用了spfile文件。当value的值为空时,则数据库没有启用spfile。此时,可以通过create spfile from pfile来创建spfile。
NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
spfile         string  /opt/oracle/product/10.2.0/db_
                1/dbs/spfilecharge.ora

=======================2. 部分控制文件损坏处理==================================

(1)当部分控制文件损坏时,Oracle数据库则无法启动,以SYSDBA登录数据库,执行startup命令,会显示报错信息。
sqlplus / as sysdba
startup
ORACLE instance started.
Total System Global Area 1048576000 bytes
Fixed Size      1223344 bytes
Variable Size    285214032 bytes
Database Buffers   754974720 bytes
Redo Buffers      7163904 bytes
ORA-00205: error in identifying control file, check alert log for more info
通过以下语句来查看控制文件的路径及名称。
SQL> show parameter control_files; 
NAME   TYPE                     VALUE
------------------------------------ ----------------------------------------------------------------- ------------------------------
control_files      string +DATA/charge/controlfile/current.279.657225541, +DATA/charge/controlfile/control03.ctl, /home/oracle/control02.ctl
此时,我们无法判断是那些控制文件故障,如果oracle使用的是spfile启动数据库,只能修改spfile配置,使用其中一个控制文件启动数据库,如果该控制文件能够成功启动数据,则以该控制文件做为恢复的原文件。
alter system set control_files= '+data/charge/controlfile/Current.279.657225541' scope=spfile;
shutdown immediate;
使用正常的控制文件将数据库启动到mount状态下,恢复其他控制文件。
startup mount;
alter database backup controlfile to '/home/oracle/control02.ctl';
alter database backup controlfile to '+data/charge/controlfile/control03.ctl'
把所有控制文件重新注册到spfile中。
alter system set control_files='+data/charge/controlfile/Current.279.657225541', '+data/charge/controlfile/control03.ctl','/home/oracle/control02.ctl' scope=spfile;
重启数据库,测试能否正常启动。
shutdown immediate;
startup;
(2)如果Oracle数据库使用的是pfile,先关闭数据库,再手动修改pfile
sqlplus / as sysdba
shutdown immediate;
cd $ORACLE_HOME/dbs
vi init.ora
在文件中显示如下信息:
*.control_files='+data/charge/controlfile/Current.279.657225541','+data/charge/controlfile/control02.ctl', '+data/charge/controlfile/control03.ctl'
跟spfile同理,我们得选择其中一个能够启动数据库的控制文件做为恢复其他控制文件的原文件。
*.control_files='+data/charge/controlfile/Current.279.657225541'
保存退出,将数据库启动到mount状态,恢复其他的控制文件。
startup mount;
alter database backup controlfile to '+data/charge/controlfile/control02.ctl';
alter database backup controlfile to '+data/charge/controlfile/control03.ctl';
shutdown immediate;
exit
再次修改pfile文件,将恢复后的控制文件添加到pfile文件中
cd $ORACLE_HOME/dbs
vi init.ora
*.control_files='+data/charge/controlfile/Current.279.657225541','+data/charge/controlfile/control02.ctl', '+data/charge/controlfile/control03.ctl'
以SYSDBA身份登录数据库,测试控制文件是否恢复完毕。
sqlplus / as sysdba
startup

=========================3. Undo表空间丢失处理================================

当UNDO表空间丢失后,数据库无法打开。以SYSDBA启动数据库时,显示UNDO数据文件丢失。
Sqlplus / as sysdba
SQL> startup
ORACLE instance started.
Total System Global Area 1048576000 bytes
Fixed Size      1223344 bytes
Variable Size    301991248 bytes
Database Buffers   738197504 bytes
Redo Buffers      7163904 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2: '+DATA/charge/datafile/undotbs1.dbf'
先将丢失的数据文件离线并删除
alter database datafile '+DATA/charge/datafile/undotbs1.dbf' offline drop;
打开数据库
alter database open;
直接新建一个UNDO表空间
create undo tablespace undotbs2 datafile '+DATA/charge/datafile/undotbs2.dbf' size 100m autoextend on next 10m;
将UNDO表空间指向新建的表空间
alter system set undo_tablespace="undotbs2" scope=spfile;
重启数据库
shutdown immediate;
startup;
用以下命令查看UNDO表空间是否被指定到了新的UNDO表空间上
show parameter undo;
NAME               TYPE  VALUE
----------------------------------  -- ----------- -----------
undo_management          string  AUTO
undo_retention          integer   900
undo_tablespace          string  undotbs2
从以下视图我们看到UNDOTBS1的表空间还存在,这时,我们需要删除废弃的表空间。
SQL> select * from v$tablespace;
       TS# NAME        INC  BIG  FLA  ENC
-------- -------------------------------------------------- --- --- ------ --- --- ---
  0 SYSTEM               YES   NO  YES
  5 UNDOTBS2            YES   NO  YES
  2 SYSAUX            YES   NO  YES
  4 USERS                YES   NO  YES
  3 TEMP                 NO   NO   YES
  6 CHARGE            YES   NO   YES
  1 UNDOTBS1            YES   NO   YES
drop tablespace undotbs1;

=========================4. Undo表空间增长过大处理================================

如果undo表空间undotbs不能释放空间,需要新建一个UNDO表空间,然后删除原来的表空间。
创建备用undo表空间
create undo tablespace undotbs2 datafile '+data/charge/datafile/undotbs2.dbf' size 100m;
切换undo表空间
alter system set undo_tablespace=”undotbs2” scope=spfile;
重启数据库
shutdown immediate
startup
drop原表空间
drop tablespace undotbs1 including contents and datafiles;
创建原undo表空间
create undo tablespace undotbs1 datafile '+data/charge/datafile/undotbs01.dbf' size 100m;
切换undo表空间
 alter system set undo_tablespace=”undotbs1” scope=spfile;
重起数据库,并把备用undo表空间删除
shutdown immediate
startup
drop tablespace undotbs2 including contents and datafiles;

========================5. Temp表空间丢失处理=================================

根据试验,当temp表空间损坏时,可以通过SQL语句Select file_name,tablespace_name from dba_temp_files;查看视图,得到temp文件的位置,将其删除。重启数据库后,数据库将自动生成temp表空间。
如果temp表空间存储在ASM上,可以修改数据库SID为+ASM后,通过asmcmd命令进入ASM中删除temp 文件
export ORACLE_SID=+ASM
$asmcmd
cd data/charge/tempfile
rm –f temp.dbf
也可以以SYSDBA身份登录数据库,在sqlplus下,输入SQL语句删除temp表空间。
drop tablespace temp including contents cascade constraints;

=========================6. Temp表空间增长过大处理================================

一般遇到TEMP空间增长过大,最直接有效的办法就是重建TEMP表间。
创建中转临时表空间
create  temporary  tablespace  TEMP2  TEMPFILE  '+data/charge/temp_file/temp02.dbf'  SIZE  512M  REUSE  AUTOEXTEND  ON  NEXT  640K  MAXSIZE  UNLIMITED;
改变缺省临时表空间  为刚刚创建的新临时表空间temp2
alter  database  default  temporary  tablespace  temp2;
删除原来临时表空间
drop  tablespace  temp  including  contents  and  datafiles;
重新创建临时表空间
create  temporary  tablespace  TEMP  TEMPFILE  '+data/charge/temp_file/temp01.dbf'  SIZE  512M  REUSE  AUTOEXTEND  ON  NEXT  640K  MAXSIZE  UNLIMITED; 
重置缺省临时表空间为新建的temp表空间
alter  database  default  temporary  tablespace  temp;
删除中转用临时表空间
drop  tablespace  temp2  including  contents  and  datafiles;

========================7. 在线日志丢失处理=================================

联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题。
损坏非当前联机日志:
(1)启动数据库,遇到ORA-00312 or ORA-00313错误,如:
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312:online log 3 thread 1: '+DATA/charge/onlinelog/ group_3.281.656620173'
从这里我们知道日志组1的数据文件损坏或丢失了
从报警文件可以看到更详细的信息
(2)查看V$log视图:
select group#,sequence#,archived,status from v$log;
 GROUP#  SEQUENCE#   ARC     STATUS
---------- ---------- --- --- --- --- --- --------- --- ----------------
  1          2           YES     INACTIVE
  2          0           NO      CURRENT
  3          1           YES     INACTIVE
可以知道,该组是非当前状态,而且已经归档。
(3)用CLEAR命令重建该日志文件
SQL>alter database clear logfile group 3;
     如果是该日志组还没有归档,则需要用
SQL>alter database clear unarchived logfile group 3;
(4)打开数据库,重新备份数据库
SQL>alter database open;
说明:
      1)如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就需要强行clear。
  2)建议clear,特别是强行clear后作一次数据库的全备份。
  3)此方法适用于归档与非归档数据库。
归档模式下当前日志的损坏有两种情况,
  (一)、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用alter database clear unarchived logfile group n来重建。
  (二)、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法
  A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份。
  B. 通过强制性恢复,但是可能导致数据库不一致。
  下面分别用来说明这两种恢复方法
通过备份来恢复
(1)打开数据库,会遇到一个类似的错误
   ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: ' +DATA/charge/onlinelog/ group_3.281.656620173 '
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error:(OS 2)系统找不到指定的文件
(2)查看V$log,发现是当前日志
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1 1 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE
(3)发现clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: '+DATA/charge/onlinelog/group_3.281.656620173'
(4)拷贝有效的数据库的全备份,并不完全恢复数据库
可以采用获取最近的SCN的办法用until scn恢复或用until cancel恢复
recover database until cancel
先选择auto,尽量恢复可以利用的归档日志,然后重新执行
recover database until cancel
这次输入cancel,完成不完全恢复,也就是说恢复两次。如:
SQL> recover database until cancel;
Auto
……
SQL> recover database until cancel;
Cancel;
(5)利用alter database open resetlogs打开数据库
  说明:
  1)这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据。
  2)这种方法适合于归档数据库并且有可用的数据库全备份。
  3)恢复成功之后,记得再做一次数据库的全备份。
  4)建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

如果没有备份,进行强制性恢复
(1)打开数据库,会遇到一个类似的错误
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '+DATA/charge/onlinelog/ group_3.281.656620173'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系统找不到指定的文件
(2)查看V$log,发现是当前日志
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1          1          NO      CURRENT
2          2          YES     INACTIVE
3          3          YES     INACTIVE
(3)发现clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: ' +DATA/charge/onlinelog/group_3.281.656620173 '
(4)把数据库down掉
SQL>shutdown immediate
(5)在init.ora中加入如下隐含参数
_allow_resetlogs_corruption=TRUE
(6)重新启动数据库,利用until cancel恢复
SQL>recover database until cancel;
Cancel
如果出错,不再理会,发出
SQL>alter database open resetlogs;
(7)数据库被打开后,马上执行一个full export
(8)shutdown数据库,去掉_all_resetlogs_corrupt隐含参数
(9)重建库
(10)import并完成恢复
(11)建议执行一下ANALYZE TABLE tablename VALIDATE STRUCTURE CASCADE;
  说明:
  1)该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致
  2)该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据。
  3)建议成功后严格执行以上的7到11步,完成数据库的检查与分析
  4)全部完成后做一次数据库的全备份
5)建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

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

转载于:http://blog.itpub.net/559237/viewspace-442884/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值