2014年(88)
分类: Oracle
2014-06-17 14:31:10
今天有个同事想把一个一部分数据导入到测试库上做测试,我给他提供了几个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 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改一下,运行就可以了,然后直接导入。