Oracle dmp文件损坏恢复案例

这个dmp文件是从一个Oracle 9i的数据库上exp出来的,在导入Oracle 11g版本的时候,可能会随机出现两类错误,如下

(1)dmp文件导入的时候,一直停留在某张表上不动,两三天都是这样,导入操作无法进行,如下

导入了 0
. . 正在导入表 "D_xxxxxx"
. . 正在导入表 "D_xxxxx2"
导入了 0
. . 正在导入表 "D_xxxxx3"
...........................................................................
...........................................................................
导入了 246844
. . 正在导入表 "D_xxxx4"

导入了 0
. . 正在导入表 "D_xxx5"

...........................................................................
...........................................................................

导入操作一直停留在D_xxx5表上,几天都是一样

注意:其中表名已经被模糊化掉 

(2)dmp文件导入的时候,在进行到某张表的时候,出现错误,如下
 
IMP-00058:遇到ORACLE 错误 1403
 
ORA-01403:未找到任何数据

Oracle教程:实例故障恢复

Linux-6-64下安装Oracle 12C笔记

CentOS 6.4下安装Oracle 11gR2(x64)

Oracle 11gR2 在VMWare虚拟机中安装步骤

Debian 下 安装 Oracle 11g XE R2

二、分析
 
(1)刚接手的时候,由于dmp文件的结构是“表结构+数据”循环这种方式保存,因此一般在一个表导入hang住的时候,很难抽取dmp文件后续部分的内容,但是我还是保存一丝侥幸心理,尝试导出dmp文件中的表结构内容,但是很遗憾,如同问题描述中错误一样,imp过程也一直停留在那张表的地方,如下
 
imp dh/dh file=D:\xxxx.DMP log=D:\dh88888.log rows=N STATISTICS=NONE INDEXES=N GRANTS=N CONSTRAINTS=n full=y show=y ignore=Y
 
(2)用尽其它手段,例如直接抽取后续的表(跟人沟通,dmp文件中存在的其余表),设置10046等事件观察什么的,也都没什么作用,还是一直hang在那个地方,而且imp进程在数据库里表现为"SQL*Net message from client"空闲等待
 
(3)考虑文件是从9i版本的数据库中exp出来,因此新安装了一个9i版本的数据库,进行imp导入,但是问题依旧
 
(4)看来dmp文件已经出现损坏,没有什么其它可跳过hang住地方的方法了,只能使用最后的手段,通过工具来将dmp文件中的数据抽取出来
 

三、解决
 
由于dmp文件100多G,无法传入到自己电脑上进行操作,只能通过远程操作,因此很多操作都没有记录下来,这里简单描述解决过程,后面模拟一个类似的实验来重现问题并解决
 
(1)通过imp将dmp文件中可以导入的表数据入库,如下
 
imp xxx/xxxx file=D:\xxxx.DMP log=D:\dh.log full=y indexes=n feedback=1024 commit=y  ignore=Y BUFFER=1000000 STATISTICS=NONE
 
注意,此处一定要设置commit=y参数
 
(2)通过设置commit=y参数,我们可以将hang住部分的表数据也导入部分
 
备注:此处也算一个小技巧,实际在我处理的这个案例中,imp导入hang住的表非常大(也就是一直imp一直停留的这张表),我们通过这种方式,发现这张表已经正常导入了200多G,因此,可以判断,这个dmp文件损坏部分的后续数据其实已经不多了。
 
(3)通过工具先扫描这个dmp文件中的所有表结构,判断dmp文件中还有多少张表未正常导入
 
(4)将dmp文件中未正常导入的表数据抽取出来,以文本形式保存,用sqlldr进行导入
 
(5)针对dmp文件中损坏的表,也将数据抽取出来,并将抽取的数据与“第二步”中导入到数据库中的表部分数据进行比较,去掉重复的数据,最后完成导入。(这里其实损坏的表数据有200G以上,幸好我们已经将大部分的数据正常入库,去掉重复数据后,仅剩一小部分而已,sqlldr很快就完成了)
 


四、实验模拟
 
(1)通过exp导出两张表,如下
 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c610cd199947f8a52015c925ce8fcc29.html