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

李真旭(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 条评论
登录 后参与评论

相关文章

来自专栏编程

tornado全面剖析与实践系列1

猿助猿的技术栈是基于Tornado的, 在学习的过程中参考了很多文章, 但是内容大都碎片化, 缺少系统性讲解, 而且不少关于异步应用的内容还是基于过时的旧版本....

2759
来自专栏SDNLAB

P4语言编程快速开始

经过前两篇的P4理论介绍,相信大家已经对P4有个基本的了解了,本片文章为大家带来P4语言编程实战。 1、系统环境安装 P4项目的官方文档上都是以Ubuntu为例...

3626
来自专栏Python

Centos crontab定时任务

CRONTAB是一个用于设置周期性被执行的任务的工具,有了它,我们就可以从定时工作中解放出来。

780
来自专栏北京马哥教育

黑客们会用到哪些Python技术?

学Python最简单的方法是什么?推荐阅读:Python开发工程师成长魔法 Python已经成为漏洞开发领域的行业标准,读者会发现大多数概念验证工具都是用Pyt...

6788
来自专栏DeveWork

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

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

21810
来自专栏Python自动化测试

Python接口自动化测试之动态数据处理(二十一)

在前面的知识基础上介绍了在接口自动化测试中,如何把数据分离出来,并且找到它的共同点,然后依据这个共同点来找到解决复杂问题的思想。我一直认为,程序...

1032
来自专栏沃趣科技

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

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

3666
来自专栏静下来

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

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

35412
来自专栏Android 研究

Android启动流程——1序言、bootloader引导与Linux启动

前面讲解的很多内容都很抽象,所以本次系列决定"接点地气",准备开始讲解大家熟悉的Activity了,为了让我以及大家更好的理解Activity,我决定本系列...

1731
来自专栏FreeBuf

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

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

2236

扫码关注云+社区