非常规方法,轻松应对Oracle数据库危急异常

简介:

作者:唐小丹(浙江移动数据库管理员)

           周  凯(上海新炬数据库工程师)


相信很多ORACLE DBA在职业生涯中或多或少都遇到过这样的情况:数据文件被误删了,存储坏了无法识别数据文件,最糟糕的是,竟然rman备份也是坏的…… 遇到问题凌乱慌张是没用的,而贸然动手也是非常危险的,当遇到紧急问题,最重要的就是冷静分析,临危不乱。


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


一、数据文件被删除的恢复


实验场景:由于维护人员的误操作,导致数据库部分数据文件被删除,数据库报错。

>>>>故障模拟


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


20160530053222224.png

11点20分数据库alert日志显示出现ora-01116等错误,根据后台日志显示此时ts_test01.dbf文件已经无法正常打开。


20160530053245706.jpg


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


20160530053252775.png


>>>>问题分析


数据文件被误删,数据库仍然处于open状态。对于此问题可以通过linux系统的“文件描述符”找回丢失的数据文件。在Linux系统中一切皆可以看成是文件,文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,所有执行I/O操作的系统调用都通过文件描述符。文件描述符打开的文件句柄以及i-node的关系如图:


20160530053302338.jpg


在linux 系统中,数据文件被删除后,其文件句柄还被相关数据库进程所打开使用,可以通过该句柄信息直接复制将其恢复。需要注意的是,在此期间数据库不能关闭。否则相关句柄将被释放,文件就无法找回。


>>>>恢复步骤


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


20160530053310362.jpg


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


20160530053330228.png


含一些数字命名的目录,它们是进程目录,其下的fd子目录包含进程相关的所有的文件描述符。子本例中oracle的dbwr 进程的fd目录下正有已经被删除的ts_test01.dbf文件的描述符(注:文件描述符为25,当前的状态是deleted)


20160530053338695.png


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


20160530053347774.png

20160530053355489.png

通过将offline 相关表空间并重置文件路径的方式完成文件重定向。


20160530053404281.png


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


20160530053412929.png


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


>>>>总结感悟


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


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

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


>>>>实验环境准备


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


20160530053419326.jpg


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


20160530053427594.jpg

20160530053434892.jpg


>>>>故障模拟


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


20160530053442542.jpg


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


20160530053449974.jpg


当再次使用startup命令启动时,数据库在mount之后由于无法识别到datafile 6(ts_test01.dbf),最终只能停留在mount阶段。


20160530053456667.jpg


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


归档日志按时间顺序记录着数据库上的各类操作(包括insert,delete,update,create 等等)。归档的丢失意味着部分操作的缺失,oracle将无法继续后续的归档文件的恢复。


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


>>>>恢复步骤


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


20160530053505988.jpg

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


20160530053512969.jpg


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


20160530053519957.jpg


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


20160530053528578.jpg


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


20160530053535321.jpg


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


20160530053543152.jpg


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


20160530053551687.jpg


>>>>总结感悟


备份作为保障数据安全的最后一道防线,备份文件的有效性应该得到充分的验证。校验发现备份集异常,丢失等问题时,应该及时发起新的数据库备份。


Oracle数据库好比一个庞大而精密的机器,关键文件好比机器中的传动齿轮,任何的缺失都会导致整个系统的停滞崩溃。作为一个合格的DBA,我们既要会用机器,也要会修机器,更要胆大心细,临危不乱,为数据库的持久稳定运行保驾续航。


本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-04-08

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3天前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
17 0
|
3天前
|
存储 大数据 测试技术
矢量数据库的性能测试与评估方法
【4月更文挑战第30天】本文探讨了矢量数据库的性能测试与评估方法,强调其在大数据和AI时代的重要性。文中介绍了负载测试、压力测试、容量测试、功能测试和稳定性测试五大评估方法,以及实施步骤,包括确定测试目标、设计用例、准备环境、执行测试和分析结果。这些方法有助于确保数据库的稳定性和高效性,推动技术发展。
|
3天前
|
关系型数据库 MySQL PHP
【PHP 开发专栏】PHP 连接 MySQL 数据库的方法
【4月更文挑战第30天】本文介绍了 PHP 连接 MySQL 的两种主要方法:mysqli 和 PDO 扩展,包括连接、查询和处理结果的基本步骤。还讨论了连接参数设置、常见问题及解决方法,如连接失败、权限和字符集问题。此外,提到了高级技巧如使用连接池和缓存连接信息以优化性能。最后,通过实际案例分析了在用户登录系统和数据管理中的应用。
|
3天前
|
SQL 关系型数据库 MySQL
利用 SQL 注入识别数据库方法总结
利用 SQL 注入识别数据库方法总结
|
4天前
|
API 数据库 Python
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
|
10天前
|
存储 Oracle 网络协议
Oracle 11gR2学习之二(创建数据库及OEM管理篇)
Oracle 11gR2学习之二(创建数据库及OEM管理篇)
|
14天前
|
Oracle 网络协议 关系型数据库
异地使用PLSQL远程连接访问Oracle数据库【内网穿透】
异地使用PLSQL远程连接访问Oracle数据库【内网穿透】
|
2天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
2天前
|
SQL 关系型数据库 MySQL
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
|
2天前
|
SQL 关系型数据库 MySQL
【MySQL-1】理解关系型数据库&数据的数据模型
【MySQL-1】理解关系型数据库&数据的数据模型

推荐镜像

更多