数据恢复:一则强行关库引发的蝴蝶效应

简介:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

李真旭(Roger)

ACOUG 核心专家,Oracle ACE,云和恩墨技术专家


这是某网友的维护的一套数据库,据说是正常重启之后就无法启动数据库了。那么我们先来看看日志是什么样的:

640?wx_fmt=png&wxfrom=5&wx_lazy=1


我们可以看到,节点1在9:48:52秒被强行终止重启了实例。而且我们还可以看出该节点从9:42开始就出现ORA-27090 错误。而该错误通常跟操作系统有关系,通过后面的Linux-x86_64 Error: 4: Interrupted system call 错误也验证了这一点。640?wx_fmt=png&wxfrom=5&wx_lazy=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1


这里我们无论是看节点1还是节点2的alert log日志都会发现,由于smon进程在进程事务恢复时失败之后,导致数据库实例最终宕掉。宕掉之后就再也无法正常启动了。很明显这是强行关库之后带来的蝴蝶效应。


这里我们来看看其中节点2的这个ORA-00600 [16559]是什么含义?

640?wx_fmt=png&wxfrom=5&wx_lazy=1


从解释来看,这是Oracle 数据字典表tab$出现了不一致的情况。比较郁闷的是,客户的dataguard也坏掉了,也是一样的错误。那么看来只能进行恢复了。这里首先要明白,节点1的ora-00600 [16703]本质上来讲跟ora-00600 [16559]是一回事。


从具体的错误来看,Oracle在open时,进行bootstrap初始化的过程就失败了,因此报错ORA-00704: bootstrap process failure.处理思路也很简单,我们首先通过10046 trace跟踪open的过程,来看看Oracle 在bootstrap初始化的时候在进行什么操作时报错的?

640?wx_fmt=png&wxfrom=5&wx_lazy=1


从上面的错误不难看出就是在访问tab$ 的时候报错的,而且是访问的obj#=20的这个对象。那么这个对象是什么呢?

640?wx_fmt=png&wxfrom=5&wx_lazy=1


根据我们的查询以及对ORA-00600 [16703],[1403],[20] 这个错误的理解,那么我这里可以大致判断这个错误后的几个数字的含义:
16703: 错误代码,表示数据字典基表存在不一致

1403: 表示数据没找到或者不匹配,即not data found.

20: 表示访问的对象号,即object_id.

同时我们从前面的10046 trace跟踪来看,报错的SQL语句访问了3个block,然后报错,分别是file 1 block 50,51,26。

这我们分别dump 上面的3个block发现其中block 51,26 的dump 内容如下:


block 51

640?wx_fmt=png&wxfrom=5&wx_lazy=1


block 26

640?wx_fmt=png&wxfrom=5&wx_lazy=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1

看到这里,我就想是否可以通过bbed先把这2个block 给修复了,看看是否能够起来。如下是简单的修复过程:


对于51号block 由于是Index 修改非常简单,这里不多说。26号block 是cluster table,这个相对复杂的多。首先提交事务、修改lock flag之后verify还是报错,如下:

640?wx_fmt=png&wxfrom=5&wx_lazy=1


这里继续修改聚簇对应的kdbr信息(这里以其中一个kdbr为例):

640?wx_fmt=png&wxfrom=5&wx_lazy=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1


我们经过几处简单修改之后,再次verify校验已经不再报错了;不过再次open数据库时,发现报另外一个错误了:

640?wx_fmt=png&wxfrom=5&wx_lazy=1


从错误来看,bootstrap的初始化过程仍然有问题。通过10046 trace跟踪发现还是那几个block。回想前面这个block的dump时,看到的几行操作是delete,如下:

tl: 4 fb: -CHDFL– lb: 0×2  cc: 0 cki: 0

那么我们这里试做将这几个被删除的操作进行还原是否ok 呢? 也就是用bbed来恢复这7个delete操作。


由于是cluster table 的block,操作相对麻烦一些。不过我尝试修改之后,最后发现错误仍然一样。其中[kdoirp-3]是什么含义呢? 我们来看下Oracle 文档的描述:

640?wx_fmt=png&wxfrom=5&wx_lazy=1


很明显,这表示insert row piece。 看来我们单纯的修改这2个block 并不能绕过这个问题。 实际上后面我dump分析发现又涉及到_next_object,又将问题复杂化了。

虽然我相信多折腾几次可以解决这个问题。但是操作确实麻烦,费劲。不过此时通过之前的备份restore出来的system文件已经ok了。这里我用bbed 将涉及到的几个block 进行替换,最后再修改resetlogs信息,重建控制文件之后,进行recover。非常顺利的打开了数据库。


最后检查alert log 还涉及到smon 回滚某个事务失败。那么如何完美处理呢?
首先dump undo header,然后获取该事务涉及的操作对象,然后使用参数屏蔽回滚段后,将undo表空间重建即可。
针对涉及到的对象,由于破坏了事务的完整性,那么建议对表进行分析,其中Index进行重建。


----the end


本文出自数据和云公众号,原文链接


相关文章
|
安全 Windows
Win系统 - 更新后,竟有这么“严重”的后果?
Win系统 - 更新后,竟有这么“严重”的后果?
118 0
Win系统 - 更新后,竟有这么“严重”的后果?
|
存储 缓存 小程序
【更多小知识】系统盘(C盘)持续发出“救命”信号(C盘仅剩不足10G,爆红)!操作过后直接腾出近20G!
【更多小知识】系统盘(C盘)持续发出“救命”信号(C盘仅剩不足10G,爆红)!操作过后直接腾出近20G!
275 0
【更多小知识】系统盘(C盘)持续发出“救命”信号(C盘仅剩不足10G,爆红)!操作过后直接腾出近20G!
|
Java Shell
进程无故消失的破案历程
进程无故消失的破案历程
进程无故消失的破案历程
|
运维 分布式计算 Hadoop
误删文件的经验之谈
一、引言   曾经在运维hadoop集群的时候,出过这么一回事:当时集群因为需要维修机器所以进行停机维护,但是当启动集群的时候发现集群怎么也起不了,在没有问别的同事的情况下,自己百度了一下问题,发现format操作能解决问题,当时的我对于format是一知半解,后来执行format以后集群是起来了,但是数据没有了。追悔莫及已经没有用了,只能对自己说吃一见长一智;这明显就是误操作导致数据被删。今天就来聊一下怎么能防止误删文件! 二、防止误删数据技巧:   1、修改或删除数据前请务必备份,最好有异机备份,修改配置等先提交版本管理系统在发布到线上环境。   2、可以使用mv命令替代rm命令,
117 0