將10.2.0.5的一個大表匯入到12.1.0.2的時候,
匯出參數是:
[oracle10g@testdb tmp]$ cat expdp.par
userid='/ as sysdba'
DIRECTORY=DUMPDIR
dumpfile=mytable_%U.dmp
tables=schema.mytable
logfile=mytable.log
job_name=mytable
parallel=8
filesize=100M
匯入參數是:
userid='/ as sysdba'
DIRECTORY=DUMPDIR
dumpfile=mytable_%U.dmp
tables=schema.mytable
logfile=mytable.log
job_name=mytable
parallel=8
content=data_only
報錯KUP-11014。
ORA-31693: Table data object "SCHEMA"."MYTABLE" failed to load/unload and is being skipped due to error:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-11011: the following file is not valid for this load operation
KUP-11014: internal metadata in file /home/oracle12c/mytable_02.dmp is not valid
Job "SYS"."MYTABLE" completed with 1 error(s) at Thu May 19 12:55:34 2016 elapsed 0 00:10:03
同樣檔案匯入到11g中沒有報錯。這是因為12c中一個Bug 20690515引起的(可以詳見Doc ID 20690515.8)。
下面我對這個bug稍微解釋一下:
1. 觸發條件:
在匯入多個dump file set(即多個dump file檔案)的時候,資料泵如果使用access_method=external_table的方式進行匯入(預設情況下12c的access_method值是AUTOMATIC,即自動選擇是extenal_table還是direct_path。至於什麼時候選擇前者什麼時候選擇後者,可參考Doc ID552424.1),用external_table方式匯入期間,會校正每個dump file的xml內容,且與第一個dump file的xml內容做對比。但匯入10.x的dump file set的時候,第一個(作為參考的那個)dump file的xml格式被轉換成11.1的格式,那麼與後面的dump file檔案做對比校正的時候,就失敗了。
2. 受影響版本:
12.1.0.2
3. 修複版本:
12.2
4. 是否有patch:
有,Patch 20690515 已經存在,有基於12.1.0.2版本的linux x86-64平台,aix平台和solaris SPARC平台。目前linux平台已經下載次數200多。
5. 是否有workaround:
有workaround,設定access_method=direct_path
如果還是報錯,再加上table_exists_action=replace
就我來看,這個bug觸發需要滿足2個條件:
1. 多個dump檔案
2. access method自動走了external table,或者強制手工指定了ACCESS_METHOD=EXTERNAL_TABLE。
(3. 可能還和表的大小有關,在某環境測試時300多M的一個表故障不重現,但是增加資料到3.6G,再次測試故障重現。但是目前在mos中沒有說明表大小的影響因素。)
我在我的虛擬機器測試環境中用來一個500多M的表,分別導成一個大檔案和6個小檔案:
建立測試表,create table test_dmp as select * from dba_objects;
多次insert into test_dmp as select * from test_dmp; 直到資料大約200多萬行,500多M的segment size。
然後匯出成一個大檔案和多個小檔案。
[oracle12c@testdb2 dump_12c]$ ls -l
total 889504
-rw-r-----. 1 oracle12c oinstall 455401472 May 19 16:01 bigdump.dmp <==單個大檔案
-rw-r--r--. 1 oracle12c oinstall 173 May 19 16:56 impdp2.par
-rw-r--r--. 1 oracle12c oinstall 145 May 19 17:19 impdp3.par
-rw-r--r--. 1 oracle12c oinstall 171 May 19 17:08 impdp.par
-rw-r-----. 1 oracle12c oinstall 104857600 May 19 15:52 mydump_01.dmp <==多個小檔案
-rw-r-----. 1 oracle12c oinstall 104857600 May 19 15:52 mydump_02.dmp
-rw-r-----. 1 oracle12c oinstall 104857600 May 19 15:52 mydump_03.dmp
-rw-r-----. 1 oracle12c oinstall 104857600 May 19 15:52 mydump_04.dmp
-rw-r-----. 1 oracle12c oinstall 34873344 May 19 15:52 mydump_05.dmp
-rw-r-----. 1 oracle12c oinstall 1118208 May 19 15:52 mydump_06.dmp
-rw-r-----. 1 oracle12c oinstall 677 May 19 17:20 mydump.log
[oracle12c@testdb2 dump_12c]$
1. 測試匯入一個大檔案,且強制使用ACCESS_METHOD=EXTERNAL_TABLE,不會報錯:
[oracle12c@testdb2 dump_12c]$ cat impdp2.par
userid='/ as sysdba'
DIRECTORY=MYDIR
dumpfile=bigdump.dmp
tables=test.test_dmp
logfile=mydump.log
job_name=mydump
parallel=2
content=data_only
ACCESS_METHOD=EXTERNAL_TABLE
[oracle12c@testdb2 dump_12c]$
[oracle12c@testdb2 dump_12c]$
[oracle12c@testdb2 dump_12c]$
[oracle12c@testdb2 dump_12c]$
[oracle12c@testdb2 dump_12c]$ impdp parfile=impdp2.par
Import: Release 12.1.0.2.0 - Production on Thu May 19 16:57:08 2016
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
Master table "SYS"."MYDUMP" successfully loaded/unloaded
Starting "SYS"."MYDUMP": /******** AS SYSDBA parfile=impdp2.par
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "TEST"."TEST_DMP" 434.2 MB 5132800 rows
Job "SYS"."MYDUMP" successfully completed at Thu May 19 16:57:26 2016 elapsed 0 00:00:17
[oracle12c@testdb2 dump_12c]$
2. 測試匯入多個檔案,且強制使用ACCESS_METHOD=EXTERNAL_TABLE,就報錯了:
[oracle12c@testdb2 dump_12c]$ cat impdp.par
userid='/ as sysdba'
DIRECTORY=MYDIR
dumpfile=mydump_%U.dmp
tables=test.test_dmp
logfile=mydump.log
job_name=mydump
parallel=2
content=data_only
ACCESS_METHOD=EXTERNAL_TABLE
[oracle12c@testdb2 dump_12c]$
[oracle12c@testdb2 dump_12c]$ impdp parfile=impdp.par
Import: Release 12.1.0.2.0 - Production on Thu May 19 16:55:30 2016
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
Master table "SYS"."MYDUMP" successfully loaded/unloaded
Starting "SYS"."MYDUMP": /******** AS SYSDBA parfile=impdp.par
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
ORA-31693: Table data object "TEST"."TEST_DMP" failed to load/unload and is being skipped due to error:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-11011: the following file is not valid for this load operation
KUP-11014: internal metadata in file /tmp/dump_12c/mydump_02.dmp is not valid
Job "SYS"."MYDUMP" completed with 1 error(s) at Thu May 19 16:55:34 2016 elapsed 0 00:00:03
[oracle12c@testdb2 dump_12c]$
3. 測試匯入多個檔案,且強制使用ACCESS_METHOD=DIRECT_PATH,也不會報錯:
[oracle12c@testdb2 dump_12c]$ cat impdp.par
userid='/ as sysdba'
DIRECTORY=MYDIR
dumpfile=mydump_%U.dmp
tables=test.test_dmp
logfile=mydump.log
job_name=mydump
parallel=2
content=data_only
ACCESS_METHOD=DIRECT_PATH
[oracle12c@testdb2 dump_12c]$ impdp parfile=impdp.par
Import: Release 12.1.0.2.0 - Production on Thu May 19 17:08:12 2016
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
Master table "SYS"."MYDUMP" successfully loaded/unloaded
Starting "SYS"."MYDUMP": /******** AS SYSDBA parfile=impdp.par
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "TEST"."TEST_DMP" 434.2 MB 5132800 rows
Job "SYS"."MYDUMP" successfully completed at Thu May 19 17:08:31 2016 elapsed 0 00:00:17
[oracle12c@testdb2 dump_12c]$
註:以上測試是在從10.2.0.5匯出,匯入到12.1.0.2;如果從11.2匯入到12.1.0.2,也不會有這個問題。考慮到可能有不少使用者會從10g升級到12c,建議打上這個bug的補丁。