程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracledmp文件損壞恢復案例

Oracledmp文件損壞恢復案例

編輯:Oracle教程

前一段時間幫一個朋友的朋友恢復了一個損壞的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)步驟。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved