ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 谈谈一般情况下由于硬盘损坏的数据恢复方法

谈谈一般情况下由于硬盘损坏的数据恢复方法

原创 Linux操作系统 作者:Davy2015 时间:2010-06-10 16:44:06 0 删除 编辑
谈谈一般情况下由于硬盘损坏的数据恢复方法
 
 
一、硬盘损坏我们可能丢失的文件:
(1)控制文件
(2)重做日志
(3)归档日志
(4)数据文件
(5)pfile/spfile
 
二、检测硬盘是否发生故障:
(1)如果是UNIX平台,可以运行例如dd等拷贝工具。
(2)如果使用RAID5阵列,要提防奇偶校验信息可能会遮掩硬盘的故障,我们可能需要做更多的细致检查。
(3)通常情况下可以查看操作系统的系统日志文件。
(4)另外一个很明显的情况,就是在操作系统中看不到硬盘或硬盘无法mount。
(5)如果受影响的是数据文件,可以在oracle这一侧运行dbv。
(6)当然,最好的检测硬盘故障的方法是运行硬件诊断工具,或者操作系统特定的磁盘工具。
 
三、替换硬盘,解决故障:
(1)用一块新的硬盘替换掉故障的硬盘,并且用同样的名称进行mount。
(2)用一块新的硬盘替换掉故障的硬盘盘,并且用不同的名称进行mount。
(3)用不同的名称mount现存的某块硬盘。
——大多数会使用(1)或(3)方法

四、Oracle侧的恢复:
解决硬盘的故障之后,就要进行Oracle层面的恢复,这依赖于丢失的文件的类型,也依赖于上述硬盘恢复的方法。
(1)控制文件
通常,我们会将多个控制文件分布在不同的硬盘上,如果一个或多个控制文件丢失,mount时会显示:
SQL> startup
Oracle Instance started
....
ORA-00205: error in identifying controlfile, check alert log for more info
用以下SQL找到控制文件的其他副本:
SQL> select * from v$controlfile;
如果至少还存在一个控制文件没有受到磁盘损坏的影响,当数据库被正常关闭后:
(a)拷贝一个良好的控制文件到丢失控制文件的位置。
(b)启动数据库。
当然,也可以在参数文件的control_files参数中,将已经丢失的控制文件注释掉。
如果,所有的控制文件都因磁盘损坏而丢失,那么检查备份的控制文件。
我们备份控制文件通常用以下方法:
(a) SQL> alter database backup controlfile to '/backup/control.ctl';
这个命令会生成一个二进制格式的控制文件备份,我们可以直接将这个二进制的文件拷贝到丢失控制文件的位置,然后:
SQL> startup mount;
SQL> recover database using backup controlfile;
SQL> alter database open;
(b)SQL> alter database backup controlfile to trace;
这个命令会生成一个trace文件,里面内容是创建控制文件的脚本程序。编辑这个trace文件(检查user_dump_dest的位置),然后保留单独的SQL命令,将其保存为cr_strl.sql脚本:
SQL> @cr_ctrl
——这个脚本会创建控制文件,恢复数据库并open。
如果没有可用的控制文件副本或备份,那么,我们只能使用数据文件和重做日志文件的信息编写一个创建控制文件的脚本,请确保脚本里所有的文件名称和位置与FILE$相一致。接下来的步骤与cr_ctrl.sql脚本相同。
注意:所有与操作控制文件相关的SQL命令都在nomount状态下执行。
(2)重做日志文件
正常情况下,我们并没有当前状态的重做日志文件的备份,但是,inactive状态的重做日志已经完成了数据文件检查点,而且也生成了相应的归档日志。
SQL> startup mount
     Oracle Instance Started
     Database mounted
     ORA-00313: open failed for members of log group 1 of thread 1
     ORA-00312: online log 1 thread 1: '/ORACLE/ORADATA/H817/REDO01.LOG'
     ORA-27041: unable to open file
     OSD-04002: unable to open file
     O/S-Error: (OS 2) The system cannot find the file specified.
(a)检查丢失的重做日志文件是否为当前状态的:
     SQL> select * from v$log;
     SQL> select * from v$logfile;
(b)如果丢失的重做日志是inactive状态的,你可以清除该文件:
SQL> alter database clear logfile '/ORACLE/ORADATA/H817/REDO01.LOG';
或者,如果你还至少有两组重做日志,你也可以将当前损坏的重做日志删除:
SQL> alter database drop logfile group 1;
(c)如果丢失的重做日志为当前状态,那么:
     SQL> recover database until cancel;
     看提示输入Cancel
     SQL>alter database open resetlogs;
      'recover database until cancel'这个命令可能会报以下错误而失败:
     ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
     ORA-01194: file 1 needs more recovery to be consistent
     ORA-01110: data file 1: '/ORACLE/ORADATA/H817/SYSTEM01.DBF'
     这种情况,restore一个旧的数据库备份,然后应用归档日志来执行不完全恢复:    
     --> restore旧备份
     SQL> startup mount
     SQL> recover database until cancel using backup controlfile;
     SQL> alter database open resetlogs;
如果数据库处于非归档模式,如果报ORA-1547、ORA-1194或ORA-1110错误,那么你只能restore一个旧的备份,然后open数据库。
注意:所有的重做日志维护操作要在mount状态进行。
(3)归档日志
如果丢失的是一个旧的归档日志文件,那么你只需要对当前数据库进行一次冷备或热备,这样你就不再需要那个旧的归档日志文件。
(4)数据文件
(a)如果损坏的仅仅是少量片段,当你访问这些块时会报ora-1578:
识别损坏块所属对象的名称和类型
基于对象类型,执行适当的恢复。
(b)如果是硬盘整体丢失,那么一个或多个数据文件需要被恢复:
SQL> startup
  ORACLE instance started.
  ...
  Database mounted.
  ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
  ORA-01110: data file 3: '/ORACLE/ORADATA/H817/USERS01.DBF'
也可能报:ORA-00376和ORA-1113
识别数据文件:
   SQL> select file#,name,status from v$datafile;
   SQL> select file#,online,error from v$recover_file;
如果是“用一块新的硬盘替换掉故障的硬盘盘,并且用同样的名称进行mount”,那么:
1)使用拷贝命令或restore命令,从备份里restore受影响的数据文件。
2)依据受影响的数据文件的类型(system、rollback/undo、temp、data或index)执行恢复。
3)依据丢失的文件类型和数据库的状态,选择执行:recover database、recover tablespace或recover datafile命令。
如果“用一块新的硬盘替换掉故障的硬盘盘,并且用不同的名称进行mount”,那么:
1) 从之前的备份中将文件restore至新的位置上。
2) SQL> STARTUP MOUNT
3) SQL> alter database rename file '/old path_name' to 'new path_name';    
   --所有受影响的数据文件都要重命名及路径
4) 依据受影响的数据文件的类型(system、rollback/undo、temp、data或index)执行恢复
5) 依据丢失的文件类型和数据库的状态,选择执行:recover database、recover tablespace或recover datafile命令。

五、非归档模式的数据库
我们仅讨论数据文件的丢失场景:
  (1) 如果丢失的数据文件是SYSTEM数据文件:
 利用旧的备份restore完整的数据库,然后启动数据库。
  (2) 如果丢失的数据文件是rollback并有活动事务:
resotore旧的备份,启动数据库。
  (3) 如果丢失的数据文件是rollback并没有活动事务:
      注释掉参数文件中的rollback_segments参数,将这个数据文件offline,然后open数据库。
  (4) 如果丢失的是临时数据文件:
      将这个数据文件offline,然后open数据库,drop该表空间,重新创建该表空间。
  (5) 如果丢失的是数据或索引数据文件:
      将该表空间offline,然后open数据库。
      如果有备份,在另外的位置将其还原。
      导出受影响表空间的对象(使用user或table级的export)
      在原数据库中创建表空间。
      将上述导出的对象进行导入。
      如果数据库是8i或以上版本,可以使用传输表空间的特性。
 
六、 参数文件
  (1) 如果有备份,直接还原。
  (2) 如果没有备份,拷贝参数文件的样例文件,并在其中添加所需要的参数。请确保db_name、control_files、db_block_size、compatible设置正确。
  (3) 如果spfile丢失,可以通过pfile来创建。

七、实际情况
当硬盘出现损坏,通常不只一个文件会丢失,像这种情况:
  (1) 结合以上方法具体的方法进行数据恢复。
  (2) 用备份执行完整的数据库恢复,并且应用归档日志,这是一个首选的方法,但是会消耗时间。

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

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-05-24

  • 博文量
    1
  • 访问量
    1414