前几天玩转oracle 总群的一个哥们求助说,数据库坏了,简单的看了下,应该是盘出问题了。
他这里的情况跟eygle以前遇到的某个case完全一样,错误如下:
Mon Jun 13 09:14:10 2011
Errors in file f:\oracle\admin\yydb\udump\yydb1_ora_3960.trc:
ORA-01110: 数据文件 11: 'F:\ORACLE\ORADATA\YYDB\NDNS001.ORA'
ORA-01115: 从文件 11 读取块时出现 IO 错误 (块 # 1)
ORA-27070: skgfdisp: 异步读取/写入失败
OSD-04016: 异步 I/O 请求排队时出错。
O/S-Error: (OS 23) 数据错误(循环冗余检查)。
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'F:\ORACLE\ORADATA\YYDB\SYSTEM01.DBF'
详情可以参考eygle的博客 http://www.eygle.com/archives/2011/06/ora_01115_io.html
不过未说明具体的恢复过程,较为遗憾。
这哥们这里不同的是损坏的文件是某个业务数据文件而非system文件,也是由于datafile header
出现问题。虽然是windows环境,不过我仍然用dbv和dd进行了检查。
C:\>dbv file=D:\oracle\product.2.0\oradata\iom\TBS_IOM_PROD4 blocksize=8192
DBVERIFY: Release 10.2.0.1.0 - Production on 星期三 7月 13 15:24:20 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
DBV-00102: FILE (D:\oracle\product.2.0\oradata\iom\TBS_IOM_PROD4) 在 verification read 操作 (-2) 期间出现文件 I/O 错误
在用dbv检测的过程中,上面所报的DBV-00102错误,metalink 上提供了一个将datafile resize 变大一个block,
然后再resize回原状的方法来避免这个错误,但是在这里显然也是不能成功,因为这是物理损坏。
或许大家或许会跟那位网友有一样的疑问,我是如何知道是数据文件头坏了呢?很简单,下面我通过dd就能看出了,如下:
C:\>dd if=D:\oracle\product.2.0\oradata\iom\TBS_IOM_PROD4 of=D:\dd.dbf bs=8192 count=100
rawwrite dd for windows version 0.6beta3.
Written by John Newbigin
This program is covered by terms of the GPL Version 2.
Error reading file: 23 数据错误(循环冗余检查)。
1+0 records in
1+0 records out
C:\>dd if=D:\oracle\product.2.0\oradata\iom\TBS_IOM_PROD4 of=D:\dd.dbf skip=2 bs=8192 count=100
rawwrite dd for windows version 0.6beta3.
Written by John Newbigin
This program is covered by terms of the GPL Version 2.
skip to 16384
100+0 records in
100+0 records out
由于这是一个非归档,无备份的环境(再次强调备份的重要性),用eygle的话说,只能通过bbed或其他极端手段来修复。
恢复方法是复制一个完整的file header block(用dd),然后再用bbed或UE去手工修改),当然这里建议使用bbed,用ue去修复
太困难,太麻烦了,反正我是看不明白,看起来就眼花。
这个较为极端的case,跟大家分享。
发表回复