Home >Database >Mysql Tutorial >Oracle dmp文件损坏恢复案例

Oracle dmp文件损坏恢复案例

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-07 16:50:211660browse

前一段时间帮一个朋友的朋友恢复了一个损坏的dmp文件,大概100多个G,记录一下恢复过程并简单总结一下一、描述这个dmp文件是从一

前一段时间帮一个朋友的朋友恢复了一个损坏的dmp文件,大概100多个G,记录一下恢复过程并简单总结一下

一、描述

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

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

 

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

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

(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导出两张表,如下
 

E:\>exp dbmon/dbmon file=e:\test\test.dmp tables=dh_sql,dh_stat
 
Export: Release 11.2.0.1.0 - Production on 星期二 6月 17 10:45:22 2014
 
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
 
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
 
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
 
即将导出指定的表通过常规路径...
 
. . 正在导出表                          DH_SQL导出了      62613 行
 
. . 正在导出表                        DH_STAT导出了      72612 行
 
成功终止导出, 没有出现警告。
 

 

(2)破坏dmp文件(各种工具,dd,ue都可以),并尝试imp导入,确保文件已经损坏,如下:
 

E:\>imp dbmon/dbmon file=e:\test\test.dmp fromuser=dbmon touser=dh
 
Import: Release 11.2.0.1.0 - Production on 星期二 6月 17 10:48:57 2014
 
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
 
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
 
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
经由常规路径由 EXPORT:V11.02.00 创建的导出文件
 
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
 
. 正在将 DBMON 的对象导入到 DH
 
. . 正在导入表                        "DH_SQL"
 
 illegal lob length marker 49920
 
 bytesread = 00000000000
 
 TABLE = DH_SQL
 
IMP-00098: INTERNAL ERROR: impgst2
 
IMP-00008: 导出文件中出现无法识别的语句:
 
IMP-00008: 导出文件中出现无法识别的语句:
 
IMP-00008: 导出文件中出现无法识别的语句:
 
IMP-00008: 导出文件中出现无法识别的语句:
 
IMP-00008: 导出文件中出现无法识别的语句:
 
...省略后续部分.......
 

 

(3)使用工具抽取dmp文件中的表结构,如下
 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn