某客户单位数据库出现异常,大致现象是:数据库状态是open的,但是其中一个数据文件无法访问,本文分享排查原因与解决问题的整个过程。
通过ls 查看文件都报错,如下所示:
同时dd命令也无法读取该文件:
此时在从数据库层面看到的信息类似如下:
从上述信息来看,数据库第11号文件无法读取。
在我们进行恢复之前,客户进行了多次尝试,还遭遇了一些数据库坏块,也遇到了不少ora-00600 错误:
上述ora-00600 错误,总的来都是常见的,几乎都可以定性为数据坏块。
对于file 3的坏块,处理相对简单,直接drop或者truncate相关对象即可,然后重建awr。
但是对于第11号数据文件,怎么办呢?这里我们的处理方法是当文件丢失处理(很久之前处理过Windows环境数据文件大小为 0 kb的问题,这几种情况都类似。)
这里我说一下简单的处理思路:
1. 通过odu 扫盘,分别以不同offset方式来扫(0和4096)。
2. 对比两次扫描结果,组合extent信息,抽取文件。
由于这里文件只有1个,大小20g左右,通过dd 拼接即可。
最终文件拼接完成后,由于这里是非归档环境,无法进行正常recover,因此还需要通过bbed来修改数据文件头的checkpoint信息。
对于文件系统来讲,目前已经不是Oracle存储的最佳选择了,建议使用ASM。当然,其他数据库比如MySQL、PostgreSQL除外。