案例:expdp dmp损坏恢复

本案例来自某客户的expdp dmp从服务器上下载下来存档之后,删除了服务器上的dmp,后来需要导入的时候发现导入报错。

看名字应该是每天都会对用户进行expdp导出。对于这类损坏的dmp文件应该如何恢复呢?oracle内部提供了DUL恢复工具,当然DUL的作用并不仅仅是抽取dmp文件,其他功能本文就不介绍了。

DUL针对exp dmp和expdp dmp分别使用unexp和unpump命令去处理,基本用法如下所示:

由于本案例是expdp dmp,所以只会演示expdp dmp的抽取。

可以通过dump expdp头部去查看dmp基本情况

从dmp的头部dump可以看到dmp的version以及字符集等等信息。由于该dmp是一个按用户导出的dmp,下面我只以某个表为例开始进行恢复演示。

首先扫描dmp文件,可以看到dmp里有多少个表,以及每个表的magic number offset。需要注意的是导出时产生的master table export开头的全局临时表也在其中。都在dmp的最后面记录。

使用hexdump或者od -x去看对应的offset可以发现Magic number 基本都是0xffff2424。 Magic number个人认为意义在于能更快更好的定位到dmp中表的位置,比如我们这里要抽取表SP_SURVIVALVALIDATION,可以通过一些脚本去首先定位该表的 Magic number ,比如我这里的方法:

左边是表在导出库里的object_id,可以看到 SP_SURVIVALVALIDATION 在第14行,那么该表在dmp中的Magic number offset为16309780480

可以看到表结构的xml信息以及从 Table data from 16309790584 until 16336012118 可以看出该表数据的offset区间。下面开始抽取工作:

可以看到数据完整的抽取了出来,抽取出来的文件需要用sqlldr去导入

该表已经成功导入,整体的使用过程还是非常简单的,但是如果dmp中表非常多,那么手工单独去处理还是比较麻烦的,必须得用脚本来处理。

此条目发表在Oracle, Oracle Recover分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注