ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

数据库起不来?用PRM-DUL从Oracle数据文件中手工恢复数据

数据库起不来?用PRM-DUL从Oracle数据文件中手工恢复数据 简介PRM-DULOracle数据库恢复工具v4.1是一份面向数据库运维与灾难恢复场景的企业级工具包专为Oracle 9i/10g/11g/12c各版本的数据救援而设计可在AIX、HPUX、SOLARIS、Linux、Windows等主流平台上运行适合DBA在数据文件损坏、误删除、数据无法正常访问等紧急情况下快速恢复数据。压缩包共19个文件大小仅6.01MB以7个jar核心程序为主体配合5个template配置模板、3个txt说明文档、1个conf配置文件以及bat/sh启动脚本和log日志文件结构清晰便于直接部署与二次配置附带依赖库目录可减少手工整理环境的时间。工具内含可执行的PRM-DUL主程序、跨平台启动脚本、配置模板及使用说明帮助用户快速掌握从环境配置、运行参数调整到数据提取的完整流程降低恢复操作的上手门槛ChangeLogs与README可辅助排错与版本核对。目前已有572人学习下载适合需要应对Oracle数据库紧急救援的运维工程师与数据恢复技术爱好者。 “数据库起不来了”——这句话对任何DBA来说都像一记重锤。你可能遇到过凌晨被电话叫醒赶到现场发现实例直接挂了反复启动只抛出一串ORA-01113、ORA-00376之类的错误也可能遇到过win10重装后装在本地磁盘里的Oracle数据文件被覆盖或丢失整个人当场懵掉还有可能遇到12c装得“不干净”导致环境乌烟瘴气升级到一半发现根本起不来。热搜里那条“win10重装后怎么恢复oracle”我印象很深因为这类问题几乎每周都有人在群里问。常规思路是有备份就恢复备份没有备份就修控制文件、修redo日志。但有一类故障实例彻底起不来物理备份和逻辑备份都没有这时候是不是真的没救了未必。只要数据文件还在哪怕里面的部分数据块已经损坏数据也大概率还静静躺在磁盘上。PRM-DUL就是在这种绝境下帮你从Oracle数据文件里把数据“抠”出来的工具。这篇文章我会把它适合什么场景、底层原理是什么、实际操作流程怎么走、有哪些坑必须避开一层层拆开讲清楚。1. 先搞懂PRM-DUL的边界它救的是“数据”不是“数据库”1.1 为什么实例起不来业务数据却还在很多开发和管理Oracle的人对数据文件的认识停留在“数据库文件”这个层面上总觉得数据库挂了数据就没了。实际上Oracle数据文件内部是分层级的表空间由数据文件组成数据文件由数据块组成。每张业务表的行数据最终都会落在某个数据块上而一个数据块里不只是简单的字段值还包含了块头、表目录、行目录这类元数据信息。这意味着什么呢数据库实例能不能启动取决于参数文件、控制文件、redo日志以及SYSTEM表空间里的数据字典是否完整但业务表的数据本身是实实在在躺在数据文件的数据块里的。只要数据文件没有被彻底覆写实例起不起得来和业务数据是否还在是两件可以分开看的事。PRM-DUL的核心原理就是绕过Oracle实例直接从文件系统的数据文件或者ASM磁盘组里的数据文件解析数据块把块里的记录识别出来再通过工具内置的字典翻译逻辑还原成可导出的行数据。它的前身DUL最初来自Oracle内部工程师的实践后来被产品化商业化PRM-DUL在图形化交互和易用性上做了大量改进目前v4.x版本在恢复领域已经算得上头部工具。1.2 什么场景适合动用PRM-DUL我整理了一下平时最常碰到的几类场景基本如下数据文件还在但实例起不来控制文件丢失、redo损坏、SYSTEM表空间损坏等系统重装、数据文件被格式化后仅剩备份副本或已拷贝出来的旧文件误删表空间后没有回收站可用又没有做逻辑备份数据库文件在损坏的ASM磁盘组上实例无法正常挂载升级失败、undo损坏等导致数据库无法open比如11.2.0.1升到11.2.0.4中途翻车这些场景有个共同特征不是“数据没了”而是“数据库软件没法正常把数据交给你”。大多数时候表数据都还在PRM-DUL要做的是打通最后一公里。但我也得把丑话说在前面它不是万能的。如果数据文件本身被覆盖、物理损坏到块完全不可读那谁也救不了。另外它面向的是普通关系表中的记录像某些LOB段损坏严重、内部特殊对象等场景可能无法完整恢复提前要有心理准备。2. 恢复成败往往在“命令行之外”开工先备材料2.1 硬材料哪些文件和信息是必须的我帮人做恢复评估时发现大多数人第一时间会甩一张报错截图过来然后直接问“怎么办”。实际上PRM-DUL这类工具要顺利工作最理想的情况是拿到四类东西数据文件清单每个表空间对应的datafile路径、文件大小数据库整体环境信息Oracle大版本、操作系统类型、位数字符集信息原库的NLS_CHARACTERSET参数文件、控制文件、redo日志的现状说明是否存在、是否损坏其中数据文件是核心。工具通过加载数据文件先扫描SYSTEM表空间里的数据字典基表把对象名解析出来再去目标表所在的表空间里读取行数据。如果你连SYSTEM表空间都拿不到能不能恢复能但会走无字典模式代价是表名、列名都变成内部编号这个后面第4章细说。字符集信息一定要在开工前确认。我遇到过一个案例数据文件从旧服务器拷贝出来原库字符集是ZHS16GBK操作的人不知道直接在默认字符集下导数据导出来的中文全部乱码。后来回头确认字符集再重新导一次就干净了。这一步看起来简单查一下参数文件里的NLS_CHARACTERSET或者原库的v$nls_parameters就可以但在紧张状态下很容易被忽略。2.2 环境准备在哪儿跑工具最稳妥PRM-DUL是基于Java的图形化工具支持Windows、Linux以及常见的Unix平台。实际操作时有两个选择一是直接把工具装到数据库所在机器上但这台机器如果已经严重损坏或者存在硬件层面的风险最好优先把数据文件整盘镜像出来二是把数据文件复制到一台干净的机器上再在上面跑工具。我的建议是第二种。理由很简单恢复工作本身是只读解析数据块的过程但谁也保证不了过程中会不会出现误操作。在原始系统上做恢复一旦操作失误可能把本可恢复的数据二次破坏。把文件复制出来后原盘留作“证物”在副本上折腾压力会小很多。复制时用dd或cp就可以前提是文件没有被占用且能完整读出。还见过有人图省事只拷贝了一部分数据文件就跑到工具上加载结果打开工具才发现少了某个文件扫描出来的数据字典是残缺的导出的结果很可能缺表缺数据。所以开始前最好列一份清单所有datafile路径、文件大小、是否可读逐项核对。这一步不花多少时间但能避开大部分返工。3. 从数据文件里“抠”数据PRM-DUL的核心恢复流程3.1 安装启动和加载数据文件PRM-DUL本身安装并不复杂解压后就能用。启动时需要Java环境建议和工具官方要求的JDK版本对齐版本不匹配会出现界面起不来的情况。别在这种事情上折腾太久换官方推荐的JDK版本就好。工具启动后最先要配置的就是数据文件加载。它支持直接从本地文件系统加载也支持通过ASM接口去读ASM磁盘组里的文件。后者是不少人头疼的点因为ASM环境下没有直接的OS文件路径。这里需要填写ASM实例的连接信息利用ASM接口把数据文件从磁盘组里抽出来分析。所以如果你遇到的是“oracle进入asm命令”这类问题建议先把ASM的基础概念捋清楚再来跑PRM-DUL。加载完数据文件后工具会先做一层结构分析和定位。这一步是为了验证文件能不能被正确解析、数据文件头是否可读相当于恢复前的体检。体检通过后才进入真正的数据字典扫描。3.2 扫描数据字典并定位目标表Oracle数据字典里最重要的基表包括USER$、OBJ$、TAB$、COL$等它们都存放在SYSTEM表空间中。PRM-DUL通过扫描这些基表把内部的对象编号翻译成用户、表名、列名从而得到一张可读的“对象地图”。这一步是能否“有尊严地恢复”的关键。字典模式恢复出来的结果字段名、类型、表名都跟原库一致接下来只要把数据按dmp或SQL格式导出就能直接导入到新的库里。扫描时间取决于SYSTEM表空间的大小和数据文件的整体规模几GB的库通常几分钟到十几分钟能完成如果文件特别大要有耐心别中途强退。扫描完成后界面会展示可恢复的对象列表你可以按用户、按表去勾选需要恢复的表。导出格式一般支持SQL和dmp如果你只是想把核心业务表补出来SQL格式最灵活如果要完整入库dmp格式更方便。导出时也建议留意工具输出的日志恢复过程中遇到损坏块时工具通常会记录告警信息。3.3 导出前先和业务对一次需求导出前务必做一次“恢复目标的确认”跟业务方核对要恢复哪些表、数据量大概多大。曾经遇到一个生产库业务方一开始说“最要紧的就是订单表和用户表”结果导出完发现还要支付流水只能重新扫描再导一遍。虽然不丢数据但确实浪费时间。另外如果你是要把恢复出来的数据导入新库建议先建好目标库的表结构确认字段类型、约束和字符集都匹配。PRM-DUL恢复的重点是行数据表结构最好用原库的建表脚本或者从恢复出的字典信息里生成。硬往一张结构不匹配的表里灌数据导进去也是垃圾数据。4. 没有SYSTEM表空间怎么办无字典模式是怎么工作的4.1 有字典和无字典的本质区别前面说的流程依赖于SYSTEM表空间里的数据字典。但如果SYSTEM表空间损坏严重或者那部分文件根本找不回来了字典模式就走不通了。这时候PRM-DUL会切到“无字典模式”。无字典模式不依赖对象名而是直接扫描所有数据块中的行记录根据块内的存储格式把字段拆出来。它的恢复能力其实很强因为行数据的存储结构里本身就带有列的数量、列的长度等信息工具能按物理格式把每一行的字段解析出来。代价是导出来的数据没有原始的表名和列名所有对象变成类似“SYSTEM开头的一套内部编号”或者一堆伪表名列名会变成通用的COL_1、COL_2这种。你需要根据数据内容去判断哪个内部编号对应哪张业务表。这个工作对熟悉业务的DBA来说还可控但对不熟悉库结构的人来说就像在一堆没有标签的箱子里找文件。4.2 无字典恢复的结果怎么“对号入座”我的习惯是无字典恢复完成后分两步走先按字段个数和首个字段的特征把候选对象筛出来。比如订单表一般是20多个字段首字段可能是订单号通过观察数据特征很容易缩小范围。再结合应用的SQL日志、历史备份里的建表语句、或者开发团队手上的表结构文档把列名和类型恢复出来。有了建表语句就能把无字典导出的临时文件转换成正式的表批量导入。这个过程麻烦但总比数据彻底丢了强。特别是“win10重装后怎么恢复oracle”这类情况很多人手上根本没有SYSTEM表空间的概念这时候无字典模式反而可能是唯一抓手。工具会尝试把所有能读到的记录都解析出来你只需要在后面做“人工匹配”这一步。4.3 为什么说无字典模式要“宁多勿少”无字典模式下宁可多导也不要少导。因为你没法靠对象名筛选稍有不慎就会漏掉数据。我一般会把所有能解析的对象全部导出来日后再根据字段特征、数据内容做筛选和清洗。虽然会产生大量临时文件但数据这个东西漏了之后再想找回来成本比多导几个文件高得多。5. 恢复完成不等于万事大吉数据校验和常见坑5.1 导出的数据必须先对账不管用哪种模式恢复导出后都必须做校验千万别直接往生产环境导。至少要做三件事行数核对导出的记录数是否和业务方能给出的参考数字一致比如某个时间段订单量大概多少。关键字段抽样抽几行检查订单号、金额、时间这些核心字段是否可读、是否在合理范围日期有没有变成0000-00-00之类的异常值。边界检查有没有行被截断有没有出现明显的NULL占比异常某些本不该为空的列是不是全空。PRM-DUL在遇到损坏的数据块时会尽量跳过坏块并把能读到的记录导出来。这是好事但也意味着结果中可能出现缺失。你要让工具输出恢复过程中遇到坏块的信息再判断缺失部分是否涉及核心数据。如果核心数据刚好落在损坏块上那就要评估用归档日志、业务系统侧数据来互补。5.2 字符集、列类型、LOB的坑字符集上面提过一次这里再强调导出的SQL文件如果你在导入时用的客户端字符集和原库不一致就算PRM-DUL解析正确导入过程中也可能变成乱码。所以导入时也要跟工具导出时指定的字符集保持一致别导出来干净、导进去变乱码。字段类型方面普通数字、日期、字符串问题不大隐患主要在LOB。大数据量LOB段可能分布在多个数据块里如果其中某些块损坏LOB内容会不完整。工具能恢复多少要看实际存储分布但你应该知道不是所有时候都能拿到完整的图片、文档内容。遇到关键LOB缺失时可以考虑结合归档日志、undo中的历史镜像做补充或者从业务系统的文件服务器侧找回。还有一个老生常谈但值得放在最后的点操作前把原始文件完整备份一份。恢复工具本身是读数据文件但你在加载、扫描过程中如果参数配置错了某些场景下工具可能尝试对文件头部信息做处理一旦执行原文件状态就变了。多留一份完整副本等于给自己留了反悔的机会。6. 我对PRM-DUL使用方式的一些看法我用这个工具处理过几次恢复需求最大的感受是它的价值不在于替代日常备份而在于成为备份失效后最后一道防线。很多人把“Oracle数据库恢复工具”想象成游戏里的复活药水双击就能满血复活实际上它是有门槛的。工具的操作本身不复杂真正考验功底的是恢复前的信息收集、恢复后的数据校验以及沟通业务方如何确认目标数据。我自己养成的习惯是定期检查归档日志的完整性并且每半年做一次从原始数据文件恢复的沙盘推演。不是为了炫技而是保证真到出事那天流程是练过的工具是装好的材料是齐全的。没有谁希望半夜被叫起来做恢复但真到了那一刻手里有一件趁手的工具心里会踏实很多。建议你趁现在系统还健康把PRM-DUL下载好、操作文档打印一份放在值班室别等出事再研究。那时候看文档的心态跟平时完全不一样。本文还有配套的精品资源点击获取
返回列表