加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle dmp文件损坏恢复案例

发布时间:2020-12-12 14:56:53 所属栏目:百科 来源:网络整理
导读:前一段时间帮一个朋友的朋友恢复了一个损坏的dmp文件,大概100多个G,记录一下恢复过程并简单总结一下 一、描述 这个dmp文件是从一个Oracle 9i的数据库上exp出来的, 在导入Oracle 11g版本 的时候,可能会随机出现两类错误,如下 (1)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:testtest.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:testtest.dmp fromuser=dbmon touser=dh Import: Release 11.2.0.1.0 - Production on 星期二 6月 17 10:48:57 2014 Copyright (c) 1982,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:testtest.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,"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",: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,"TYPE" VARCHAR2(19)) dump file e:testtest.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,"TYPE" VARCHAR2(19)) dump file e:testtest.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:testDBMON_DH_SQL.ctl SQL*Loader: Release 11.2.0.1.0 - Production on 星期二 5月 1 11:16:43 2007 Copyright (c) 1982,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)步骤。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读