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

简介:

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


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


相关文章
|
7月前
|
存储 运维 数据挖掘
服务器数据恢复-服务器硬盘掉线导致银行业务模块崩溃的数据恢复案例
某银行的某一业务模块崩溃,无法正常使用。排查服务器故障,发现运行该业务模块的服务器中多块硬盘离线,导致上层应用崩溃。 故障服务器内多块硬盘掉线,硬盘掉线数量超过服务器raid阵列冗余级别所允许的硬盘掉线数量,导致服务器瘫痪。可以通过修复硬盘物理故障,提取故障盘数据后重组raid的方案来恢复服务器数据。
|
6月前
|
SQL 运维 测试技术
记一次由于操作失误致使数据库瘫痪的故障分析与解决方案
在这篇文章中,我将分享一次由于操作不当导致数据库瘫痪的经验。通过回顾故障发生的时间、系统简介、时间线、问题分析和经验总结等方面的内容。讨论操作时间不当、操作流程不当、缺乏执行计划和限流机制等问题,并提出一些建议,如确认数据库更新时间、优化更新操作、使用限流工具、设置超时时间和重试机制、调整数据库参数以及定期维护和优化数据库。通过分享这次经验,我希望能帮助他人避免类似的错误,并提高数据库操作的准确性和稳定性。
|
11月前
间歇性宏图大志,持续性混吃等死...
间歇性宏图大志,持续性混吃等死...
51 0
|
存储 缓存 NoSQL
Redis持久化锦囊在手,再也不会担心数据丢失了
大家好,我是小羽。Redis 的读写都是在内存中进行的,所以它的性能高。而当我们的服务器断开或者重启的时候,数据就会消失,那么我们该怎么解决这个问题呢?其实 Redis 已经为我们提供了一...
225 0
Redis持久化锦囊在手,再也不会担心数据丢失了
|
运维 分布式计算 Hadoop
误删文件的经验之谈
一、引言   曾经在运维hadoop集群的时候,出过这么一回事:当时集群因为需要维修机器所以进行停机维护,但是当启动集群的时候发现集群怎么也起不了,在没有问别的同事的情况下,自己百度了一下问题,发现format操作能解决问题,当时的我对于format是一知半解,后来执行format以后集群是起来了,但是数据没有了。追悔莫及已经没有用了,只能对自己说吃一见长一智;这明显就是误操作导致数据被删。今天就来聊一下怎么能防止误删文件! 二、防止误删数据技巧:   1、修改或删除数据前请务必备份,最好有异机备份,修改配置等先提交版本管理系统在发布到线上环境。   2、可以使用mv命令替代rm命令,
115 0
|
数据库
即使删了全库,保证半小时恢复
近期一篇《就这样把根目录删了!!!》引发了广泛的讨论,《如何防止根目录被删》汇总了7种防删方案。还有同学评论中反馈“不小心把库删了”,如何快速恢复删掉的数据库,是今天要讨论的话题。
791 0