天天看點

關于partition table import的問題

今天有個同僚想把一個一部分資料導入到測試庫上做測試,我給他提供了幾個dump檔案,但是在導入的時候,碰到了一些問題,總結如下。

scenario 1:一部分表在schema下已經存在

導入資料貌似還算正常,但是在導入後報出了一系列錯誤,如下

IMP-00017: following statement failed with ORACLE error 20000:

 "DECLARE  SREC DBMS_STATS.STATREC; BEGIN SREC.MINVAL := 'C20444'; SREC.MAXVA"

 "L := 'C3394C2D'; SREC.EAVS := 0; SREC.CHVALS := NULL; SREC.NOVALS := DBMS_S"

 "TATS.NUMARRAY(367,567544); SREC.BKVALS := DBMS_STATS.NUMARRAY(0,1); SREC.EP"

 "C := 2; DBMS_STATS.SET_COLUMN_STATS(NULL,'"AGREEMENT_PARAM"','"OFFER_IN"

 "STANCE_ID"','"AMAXVALUE"',NULL,NULL,30643,.0000326338804947296,386120,srec,"

 "3,6); END;"

IMP-00003: ORACLE error 20000 encountered

ORA-20000: AMAXVALUE invalid partition name

ORA-06512: at "SYS.DBMS_STATS", line 1790

ORA-06512: at "SYS.DBMS_STATS", line 5427

ORA-06512: at line 1

Import terminated successfully with warnings.

根據提示,好像是partition的命名規則不同,查詢了一下,也确實,源庫上有10多個partition,但這個測試庫隻有1個max partition,而且命名也不一樣。和同僚商量了下,先把max partition的名字改一下,導入之後再改回來,重新嘗試,還是報如上的錯誤。

仔細看了看報錯,發現時在調dbms_stats, 才明白是去取statistic的資訊,然後我在imp的時候多加了一個參數 statistics=none,問題解決。

. importing PRDAPPO's objects into JEANRON

. . importing partition     "AGREEMENT_PARAM":"A0"          0 rows imported

. . importing partition     "AGREEMENT_PARAM":"A1"       6493 rows imported

. . importing partition     "AGREEMENT_PARAM":"A2"       6355 rows imported

. . importing partition     "AGREEMENT_PARAM":"A3"       6663 rows imported

. . importing partition     "AGREEMENT_PARAM":"A4"       6695 rows imported

. . importing partition     "AGREEMENT_PARAM":"A5"       6658 rows imported

. . importing partition     "AGREEMENT_PARAM":"A6"       6869 rows imported

. . importing partition     "AGREEMENT_PARAM":"A7"       6782 rows imported

. . importing partition     "AGREEMENT_PARAM":"A8"       6811 rows imported

. . importing partition     "AGREEMENT_PARAM":"A9"       6817 rows imported

. . importing partition "AGREEMENT_PARAM":"AMAXVALUE"     597659 rows imported

Import terminated successfully without warnings.

scenario2: 一部分表在該schema上不存在

由于兩個庫的表空間不同,在導入的時候報出了tablespace 的問題,

由于資料庫是遠端服務,沒有直接的權限去操作遠端的庫,而且随意建表空間也會被監控,于是使用dbms_metadata從源庫上生成了ddl語句,

腳本如下:

SET SERVEROUTPUT ON;

SET LINESIZE 500;

SET FEEDBACK OFF;

SET LONG 99999999     ;  

SET PAGESIZE 1000 ; 

set head off;

EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);

EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);

EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',true);

EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',true);

EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',false);

EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'REF_CONSTRAINTS',false); select DBMS_METADATA.GET_DDL('TABLE','AGREEMENT_PARAM','PRDAPPO')from dual;

導出後,把tablespace改一下,運作就可以了,然後直接導入。