Oracle数据库齿轮变灰色,非常规方法,轻松应对Oracle数据库危急异常

相信很多ORACLE DBA在职业生涯中或多或少都遇到过这样的情况:

下面我通过几个实战案例,给大家介绍几例数据文件异常可采用的非常规恢复方法。

一、数据文件被

实验场景:由于维护人员的误操作,导致

>>>> 故障模拟

10 点59分,误操作删除文件

1281c50d3514dea3a3a73b41fa405ab4.png

11 点20分数据库alert日志显示出现ora-01116等错误,根据后台日志显示此时ts_test01.

62882fac944bde65e57356d36ebfc7c5.png

但是数据库没有因此关闭,还处于read write状态。

5e2a9bc636ce3c5d330d3269f75bc41e.png

>>>> 问题分析

数据文件被误删,数据库仍然处于open状态。对于此问题可以通过

80aa5db59dab4b556851fa9c44d787bc.png

在linux 系统中,数据文件被删除后,其文件句柄还被相关数据库

>>>> 恢复步骤

尝试通过oracle dbwr进程找到被误删除的文件句柄

1323b7ffb1854e3f218bfb61fb820cf3.png

当前的oracle dbwr进程的spid是3293 可以通过该进程找到丢失的ts_test01.dbf 文件句柄

a93e79d0187edbb72569b56557208ab2.png

含一些数字命名的

0b23b0adacffb9ec1a96391b6ed29b0f.png

通过copy的方式恢复已删除的数据文件,并设置正确的属组权限。

fa7bd80d73f52af78c404575ea69e582.pngdcd0c575245f3c26dca212d2e8b4f88b.png

通过将offline 相关表

e0ba641f3775dff6004e20ff97107f2c.png

由于前期数据文件无法open的问题,部分已更改的数据无法写入数据文件,导致datafile header 上的checkpoint#和controlfile文件的checkpoint_change#不一致,需要对数据文件进行介质恢复。

9f65b4b2a0ea2e0aea9f8faca4ced143.png

进行介质恢复之后,表空间可以正常online,故障处理也算完成。

>>>>

作为系统维护人员rm,mv均属于高危操作,在执行之前一定要反复思考,确定影响,做到“宁停3分,不抢1秒”。当遇到数据库问题时,应维持故障现状,在没有清楚的了解问题原因以及解决方案之前,草率的行动将使问题复杂化,造成不可估量的损失。对于此案例,如果贸然的关闭数据库,只能使用rman备份进行恢复,如果备份失效,数据丢失将不可避免。总之做到,临危不乱!三思而行!

二、使用bbed跳过归档文件的完全恢复

实验场景:存储损坏导致部分数据文件损坏,需要使用备份进行还原,在数据库恢复阶段发现缺失部分归档,导致数据库无法恢复,正常启动。

>>>> 实验环境准备

使用rman 为数据库做一个全备

747d5b2fc50629b603a9ac5525994d75.png

对test表执行insert操作,每三次insert后执行一次switch logfile,保证生成的34,35,36三个归档各包含3条insert的操作日志。

16e4671584a103776b7ce97344395450.pngb6f6fb19016e04ded9f5159ca14d70ec.png

>>>> 故障模拟

通过abort方式停库后,删除ts_test01.dbf 文件模拟存储故障。

ae080c8bdd0feffa297bfb1f9b932ee3.png

人为删除sequence 35的归档日志。至此,故障已经重现。

1604081127396119.jpg

当再次使用s

936306e574bb81c4c5c236e8edd1a901.png

通过rman 的方式进行数据文件还原。在介质恢复阶段rman报错:no backup of archived log for thread 1 with sequence 35 and startingscn of…….。正是因为缺失了35号归档导致还原无法完成(35号归档已经被人为删除)。

归档日志按

在此情况下使用常规手段显然无法正常open数据库。需要通过bbed跳过缺失的归档使其继续完成介质恢复。

>>>> 恢复步骤

通过rman的crosscheck archivelog all命令校验归档日志发现,缺少35号归档。

5f54d35f5dbe4f15b39be2d53f10efc8.png

跳过缺失的归档需要将6号文件的scn向前推进至少大于等于36号归档的first change#1243371

de6f0a3fb00028346adeda5b84382e0c.png

数据文件的scn被记录在文件1号block偏移量484字节开始的四个字节中。当前6号文件的scn经过大小端转换之后十进制的数值为1243327(dump的原值为bff81200经大小端转换后的十六进制为0012f8bf)。该值正好是35号归档的first change#

6328ec277e452d0ae8dccade5ab936ed.png

使用bbed更改数据文件头的scn号,使其变为1243381(注意更改的scn需要大于36号归档的first change#,在这次实验中使用36号归档的first change#10作为新的scn号,经过十六进制以及大小端转换后数据为f5f812), 并使用sum apply 命令重新计算校验和。

c4b33a45966267bb76920b0124d030c6.png

要想跳过归档还需要数据文件头块的rba。它由seq#、log block#、偏移量(固定为16)组成,决定了数据文件从哪个归档日志的哪个位置开始应用归档。Rba位于数据文件头块偏移量500处开始连续的12个字节(如图从23开始到0000ffff结束,前4个字节是日志的序列号,中间4个字节是日志块号,最后4个字节是偏移量)。

446f8d634647284eb61b23cd1cbebe9f.png

将rba修改为接下去的归档日志.log block#.offset#(这次试验rba被修改为24000000.02000000.10000000即36.2.16)

1604081127396123.jpg

再次执行数据文件6的介质恢复后数据库可以正常打开。由于跳过了部分日志,免不了存在数据丢失或者不一致的问题。对于采用此方法恢复的数据库建议在合适的时候停机重建。

2c251f3b7c53da28df117f8114999d4c.png

>>>> 总结感悟

备份作为保障数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值