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

李真旭(Roger)

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

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

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

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

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

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

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

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

根据我们的查询以及对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

block 26

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

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

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

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

从错误来看,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 文档的描述:

很明显,这表示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

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-10-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏静下来

#1273 – Unknown collation: ‘utf8mb4_unicode_ci’的解决方法

前段时间没心情更新博客,现在打算又慢慢更新吧。 换了个域名,换个心情。 最近由于一个新的网站程序。对mysql、php版本有特殊要求。 又不想浪费钱再去买个服务...

37312
来自专栏FreeBuf

Grub2被曝登陆验证绕过0Day,影响众多Linux版本(CVE-2015-8370)

描述 近日,研究人员发现了一个Grub2的漏洞,版本1.98(2009年发布)到2.02(2015年发布)均受影响。本地用户能够通过这个漏洞绕过任何形式的认证(...

2486
来自专栏Java帮帮-微信公众号-技术文章全总结

Java并发学习1【面试+工作】

2068
来自专栏DeveWork

解决WordPress 打开Feed页面“This page contains the following errors…”的问题

趁着国庆假,今天解决了 Jeff的阳台 的Geekwork主题的几个bug。其中一个是打开feed页面(即http://www.jianhui.org/feed...

24210
来自专栏IT技术精选文摘

比ls快8倍?百万级文件遍历的奇技淫巧

在Linux下当我们操作一个文件数较少的目录时,例如执行ls列出当前目录下所有的文件,这个命令可能会瞬间执行完毕,但是当一个目录下有上百万个文件时,执行ls命令...

1573
来自专栏小狼的世界

Centos6最小化安装中设置网卡默认启动

Centos 6.0版本提供了一个"最小化"(Minimal)安装的选项。这是一个非常好的改进,因为系统中再也不会存在那些不必要的文件和服务,这样我们就可以实现...

912
来自专栏cloudskyme

分布式文件存储的数据库——Mongodb

什么是mongodb MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。    MongoD...

3866
来自专栏黑泽君的专栏

MyEclipse 2017 CI 中使用 Java Working Set 来管理项目

MyEclipse 2017 CI  作为一款流行的JavaIDE开发工具,其有很多好用的功能为我们的开发提供帮助。但我们的工作空间中有很多项目时,管理起来就很...

2251
来自专栏逸鹏说道

变种XSS:持久控制

0x00 引言 首先声明,这不是一个新洞,看过 Homakov 文章(最后附)以及译文的人想必对这种漏洞有所了解。 但原文写的太过简单(没有说明利用条件、情景和...

3736
来自专栏沃趣科技

ASM 翻译系列第四弹:高级知识 kfed 元数据编辑器

原作者:Bane Radulovic 译者: 赵恩东 审核: 魏兴华 DBGeeK社群联合出品 kfed - ASM metadata editor...

3796

扫码关注云+社区