今天有個同僚想把一個一部分資料導入到測試庫上做測試,我給他提供了幾個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改一下,運作就可以了,然後直接導入。