love wife love life —Roger的Oracle/MySQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL数据恢复、性能优化、迁移升级、紧急救援等服务

Oracle如何恢复被误删除的PDB

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL数据恢复博客

本文链接地址: Oracle如何恢复被误删除的PDB

最近太忙,一直没时间写blog;加上前段时间blog空间除了点问题,因此整体迁移到阿里云并且重新备案了。后续有时间我会定期更新,保持写作习惯,不能把技术荒废了。

这是去年底某客户的一个case,误删除了6个pdb且带了including datafiles参数;这是一个非常复杂的恢复;据说用户开始找了国内很多恢复专家都没恢复成功;最终经过几天的努力,我们最终恢复了全部数据;针对这样的case;据我了解目前国内只有我们可以做这个恢复

针对此Case我们最开始预想了几种方案:

1) 使用Oracle AMDU
通常当ASM磁盘组无法mount的时候常常会想到使用AMDU去抽取数据文件,那么此次故障是否可以使用amdu呢?,这显然是不能的
   amdu抽取asm文件的原理是通过asm文件号找到该文件对应的FILEDIR(asm 1号文件)的kfffde[0-59]找到file extent信息,如果extent个数大于60还需要借助kfffde[60+]指向的INDIRECT的kffixe来获取asm file每个extent所在的disk#,au#,从而完成抽取的。如果asm 1号文件FILEDIR损坏或者清空的情况下,amdu是无法完成文件抽取的。而drop datafile操作正好会清理掉FILEDIR的kfffde[0-59]和kfffde[60+]指向的INDIRECT的kffixe。

 

2)使用老熊的ODU软件

odu在asm 1号文件FILEDIR损坏或者清空的情况下,通过配置asmdisk.txt,可以扫描该配置文件中所有的磁盘,会产生很多.odu文件,其中一个非常重要的文件是asm_fileext_meta.odu该文件以最小au也就是1M为1行记录,记录磁盘每个au所在的asmdisk#,au#,au_block#,第一个块的rdba、rfile#和block#,数据块大小等信息,相当于通过扫描磁盘建立数据文件的fileext,唯一不同的是FILEDIR记录的是asm文件号,这里记录的是相对文件号,随后即可通过extract命令根据rfile#来按照rdba的是顺序来抽取数据文件,具体操作详见http://www.oracleodu.com/cn/。但是此案例是删除了多个pdb,单纯的使用odu也无法实现;原因是pdb之间会存在相同rdba的情况,也就是说rfile#是一样的。在rdba相同的情况下此时odu根本不知道数据块是属于哪个pdb哪个数据文件的(除了数据文件头所在的第一个au,因为有且只有数据文件头中存在绝对文件号),从而就无法做出正确的抽取。

换句话讲;要找到其中的关系,就是本次恢复的关键所在。

那么如何寻找呢?这里我们需要通过去分析ACD(Active Change Directory)和COD(Continuing Operation Directory)元数据信息;寻找其中关键信息。

LGE为ACD redo log record,BCD为ACD block change descriptor。改动向量0和1组成的重做记录0,这点和redo基本一样。
以上描述了asm file 323的FILEDIR kfffde[60](kfffde从0开始计算)所指向的INDIRECT(disk#为28230 au#为7)的kffixe[3]被清空。
即asm file号为323的extent号为7263的file extent map被清理。
备注::对于indirect,extent#=KFFIX_EXT.xnum+60+indirect block#*480=3+60+15*480=7263,一个indirect block包含480个extent信息

以上描述了asm file 321的FILEDIR的kfffde[48] extent信息被清空。
即asm文件号为321的extent号为48的file extent map被清理。
备注:对于direct extent#=KFFFD_EXT.xnum=48。
但是始终没有看到drop之前的file extent map记录。由于drop datafile已经完成,所以COD也清空了更改之前的信息。 那么如何找到之前的记录呢?这将是本次恢复的核心技术点所在

最终答案是什么呢?由此通过amdu抽取出asm 3号文件ACD,遍历ACD元数据块筛选出drop pdb的时间戳AT条目的所有变更记录,则可以完全的恢复被drop掉的asm file的extent map。然后重新构造asm_fileext_meta.odu文件并结合odu最终完美的恢复了被误删除的6个pdb。

不得不都说ODU非常的强大。这种方法我们验证可以恢复12c以及以后版本。

Leave a Reply

You must be logged in to post a comment.