Oracle dmp文件损坏恢复案例

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

一、描述

这个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:未找到任何数据

二、分析

(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文件中的表结构,如下

DUL>  scan dump file e:\test\test.dmp;

0: CSET: 852 (ZHS16GBK)

3: SEAL EXPORT:V11.02.00

20: USER DBMON

28: TYPE TABLES

2317: TABLE "DH_SQL"

2332: CREATE TABLE "DH_SQL" ("ID" NUMBER, "NAME" VARCHAR2(128), "TYPE" VARCHAR2(19))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 41

94304 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS

2597: INSERT INTO "DH_SQL" ("ID", "NAME", "TYPE") VALUES (:1, :2, :3)

2661: BIND information for 3 columns

col[  1] type 2 max length 22

col[  2] type 1 max length 128 cset 852 (ZHS16GBK) form 1

col[  3] type 1 max length 19 cset 852 (ZHS16GBK) form 1

Conventional export

2687: start of table data

2781632: TABLE "DH_STAT"

2781648: CREATE TABLE "DH_STAT" ("ID" NUMBER, "NAME" VARCHAR2(128), "TYPE" VARCHAR2(19))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIA

L 4194304 NEXT 1048576 MINEXTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS

2781914: INSERT INTO "DH_STAT" ("ID", "NAME", "TYPE") VALUES (:1, :2, :3)

2781979: BIND information for 3 columns

col[  1] type 2 max length 22

col[  2] type 1 max length 128 cset 852 (ZHS16GBK) form 1

col[  3] type 1 max length 19 cset 852 (ZHS16GBK) form 1

Conventional export

2782005: start of table data

5898003: CREATE INDEX "IND111" ON "DH_STAT" ("NAME" )  PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 3145728 NEXT 1048576 MINEXTENTS 1 FREELISTS

1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING

5898339: CREATE INDEX "IND_2" ON "DH_STAT" ("NAME" , "ID" )  PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 4194304 NEXT 1048576 MINEXTENTS 1 FREE

LISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING

5900617: TABLE "DH_STAT"

5900705: ENDTABLE

5900740: EXIT

5900745: EXIT

(4)抽取dmp文件中的表数据,如下

1.抽取"DBMON"."DH_SQL"表数据

DUL> unexp table "DBMON"."DH_SQL" ("ID" NUMBER, "NAME" VARCHAR2(128), "TYPE" VARCHAR2(19)) dump file e:\test\test.dmp from 0;

DUL: Error: column 1 length 771 exceeds max bind size 22

0000000000 54455850 4f52543a 5631312e 30322e30 TEXP ORT: V11. 02.0

0000000016 300a5544 424d4f4e 0a525441 424c4553 0.UD BMON .RTA BLES

0000000032 0a323034 380a300a                   .204 8.0.

0: column 1 type NUMBER size 771 failed

0: row 1 failed

row conversion failure, retrying from offset 1

2687: succesful conversion      2687 bytes skipped due to conversion problems

DUL: Error: Bad digit in number 222 (0xdf)

0000000000 c3df03d2                            ....

2897: column 1 type NUMBER size 4 failed

2897: row 7 failed

row conversion failure, retrying from offset 2862

2925: row 7 partial success

2960: succesful conversion      63 bytes skipped due to conversion problems

DUL: Error: column 1 length 3844 exceeds max bind size 22

0000000000 ddf20406 13d05359 535f594f 49443030 .... ..SY S_YO ID00

0000000016 d0303f31 30333034 24040054 59504500 .0?1 0304 $..T YPE.

0000000032 000400c3 0204050c                   .... ....

3109: column 1 type NUMBER size 3844 failed

DUL: Error: column 1 length 21835 exceeds max bind size 22

0000000000 245f524d 47525f50 4c414e5f 54040054 $_RM GR_P LAN_ T..T

0000000016 59504500 000400c3 02050f13 00535953 YPE. .... .... .SYS

0000000032 5f594f49 44303030                   _YOI D000

3109: column 1 type NUMBER size 21835 failed

3109: row 12 failed

row conversion failure, retrying from offset 3085

3144: succesful conversion      35 bytes skipped due to conversion problems

DUL: Error: column 1 length 223 exceeds max bind size 22

0000000000 c302040a 13005359 535f594f 49443030 .... ..SY S_YO ID00

0000000016 3030f031 30333038 24040054 f9d04500 00.1 0308 $..T ..E.

0000000032 df04d0c3 0204f9df                   .... ....

3235: column 1 type NUMBER size 223 failed

3235: row 15 failed

row conversion failure, retrying from offset 3202

3236: row 15 partial success

3337: row 15 partial success

3454: succesful conversion      219 bytes skipped due to conversion problems

Unloaded 62604 rows, end of table marker at 2781631

2.抽取"DBMON"."DH_STAT"表数据

DUL> unexp table "DBMON"."DH_STAT" ("ID" NUMBER, "NAME" VARCHAR2(128), "TYPE" VARCHAR2(19)) dump file e:\test\test.dmp from 2781632;

DUL: Error: column 1 length 16724 exceeds max bind size 22

0000000000 424c4520 2244485f 53544154 220a4352 BLE  "DH_ STAT ".CR

0000000016 45415445 20544142 4c452022 44485f53 EATE  TAB LE " DH_S

0000000032 54415422 20282249                   TAT"  ("I

2781632: column 1 type NUMBER size 16724 failed

2781632: row 1 failed

row conversion failure, retrying from offset 2781633

2782005: succesful conversion      373 bytes skipped due to conversion problems

Unloaded 72612 rows, end of table marker at 5898002

DUL: Warning: Recreating file "DBMON_DH_STAT.ctl"

(5)将数据通过sqlldr入库,如下

1.先删除表中数据

SQL> conn dbmon/dbmon

已连接。

SQL> delete dh_sql;

已删除62613行。

SQL> commit;

2.sqlldr进行导入

E:\test>sqlldr dbmon/dbmon control=e:\test\DBMON_DH_SQL.ctl

SQL*Loader: Release 11.2.0.1.0 - Production on 星期二 5月 1 11:16:43 2007

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

达到提交点 - 逻辑记录计数 64

达到提交点 - 逻辑记录计数 128

达到提交点 - 逻辑记录计数 192

达到提交点 - 逻辑记录计数 256

达到提交点 - 逻辑记录计数 320

达到提交点 - 逻辑记录计数 384

达到提交点 - 逻辑记录计数 448

达到提交点 - 逻辑记录计数 512

达到提交点 - 逻辑记录计数 576

达到提交点 - 逻辑记录计数 640

达到提交点 - 逻辑记录计数 704

达到提交点 - 逻辑记录计数 768

达到提交点 - 逻辑记录计数 832

达到提交点 - 逻辑记录计数 896

达到提交点 - 逻辑记录计数 960

达到提交点 - 逻辑记录计数 1024

...省略一部分.......

达到提交点 - 逻辑记录计数 62426

达到提交点 - 逻辑记录计数 62490

达到提交点 - 逻辑记录计数 62554

达到提交点 - 逻辑记录计数 62606

3.确认数据已经导入

SQL> select count(*) from dh_sql;

COUNT(*)

----------

62605   --小于导出时的记录数

可以看到,部分数据由于损坏,已经丢失

(6)处理其它表,根据(1)-(5)步骤。

Oracle dmp文件损坏恢复案例,布布扣,bubuko.com

时间: 2024-07-30 13:44:37

Oracle dmp文件损坏恢复案例的相关文章

案例:Oracle exp dmp文件损坏 通过CPFL工具抽取dmp中的数据表进行恢复

Oracle数据库逻辑导出exp的dmp文件损坏,通过非常规恢复抽取dmp文件中表的数据 在有些时候,exp的dmp文件因为某种原因损坏(比如磁盘异常,exp过程损坏等),导致imp导入无法继续,下面的处理方法(直接读取dmp文件)来对dmp文件进行抢救性恢复,最大程度减少数据丢失损失 1.创建exp dmp文件并使用dd破坏 SQL> create table t_xifenfei as select * from dba_objects; Table created. SQL> selec

Oracle dmp文件导入(还原)到不同的表空间和不同的用户下

Oracle dmp文件导入(还原)到不同的表空间和不同的用户下 一.exp/imp解决方法: 1.可以用sed修改dmp文件,正常导入 sed -i 's/TEST_TS/USERS/g' a.dmp 2.dmp文件包含导出时候表空间的信息,导入时候如果没有创建相应的表空间会提示表空间不存在3.如果几个表导出,导入时将错误忽略 ignore=y即可 4.用transport_tablespace参数,transport tablespace将一个表空间下的数据移到另一个表空间 4.1.使用tr

Oracle模拟文件损坏BBED

模拟文件损坏可以使用两个工具,windows nt 下使用uttra edit ,还有就是使用ORACLE内部工具BBED,下面主要看这个工具如何使用. 一.BBED(Oracle?Block?Browerand?EDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用.该工具不受Oracle支持,所以默认是没有生成可执行文件的,在使用前需要重新连接. 我这里的作用 二.BBED 安装

Linux 中 Oracle dmp 文件导入导出

a. 用户名 system 密码 manager 导出到D:/daochu.dmp中 exp system/[email protected] file=d:/daochu.dmp full=y b. 将数据库中 system 用户与 sys 用户的表导出 exp system/[email protected] file=d:/daochu.dmp owner=(system,sys) c. 将数据库中的表 inner_notify.notify_staff_relat导出 exp aicha

oracle dmp文件的导入与导出

dmp文件的导入与导出: 整库的导入导出 1.从远程机器上导出expdp npmdb/[email protected] schemas=NPMDB directory=MY_DIR dumpfile=npmdb_87.dmp 参数说明schemas:可以看成是数据库名,directory:存放dmp,log文件的目录,dumpfile:导出的dmp文件名注:directory目录的创建create directory data_pump_dir as '/opt/data/oracle_tmp

oracle dmp文件的导入导出

一.命令行方式 exp 用户名/密码@库名 file=文件位置.dmp owner=用户名 imp 用户名/密码@库名 file=文件位置.dmp 注意 : 导入过程若有的表已经存在可能会报错,可以全部删除再重新导入或者加上ignore=y选项,若导出过程中显示正在导出有问题的统计信息,最大的可能是字符集不同,调整字符集后重新导出即可. 以下是windows的批处理任务,加入计划任务即可定时备份oralce数据库 以下是windows批处理任务备份方式: @echo off ::Windows环

MongoDB数据库文件损坏恢复数据全过程

一.故障描述 客户设备环境为一台操作系统为Windows Server 2008的服务器,部署MongoDB数据库.由于业务需要,客户在未关闭MongoDB数据库服务的情况下,对数据库文件进行了拷贝.将数据库文件拷贝到其他分区后,客户对原数据库分区进行了格式化操作,后将数据库文件拷回原分区,重新启动MongoDB服务,这时,客户发现服务无法启动.报错如下:图一: 二.故障检测 一般来说,在服务没有关闭的情况下,直接对MongoDB数据库文件进行拷贝,由于服务还在运行,会导致mongod.lock

oracle导入dmp文件(恢复数据)

以下操作使用oracle管理员身份进行(如:sysdba) 1. 创建表空间 说明:创建的表空间名称需要和导出dmp那个表空间名称对应 create tablespace clims logging datafile 'D:\app\scott_ns\clims.dbf' size 100m autoextend on next 50m extent management local; 2. 创建用户 说明:创建的用户名称需要和导出dmp那个用户名称对应 create user clims id

物理删除oracle数据文件的恢复

归档模式下测试: 一.open状态下物理删除数据文件,关闭情况恢复: SQL> create tablespace test datafile '+DATA/mecbs/datafile/test01.dbf' size 10M; Tablespace created. SQL> conn scott/scott; Connected. SQL> conn /as sysdba Connected. SQL> create user test identified by test