?Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
?. . exported "AD"."ADTAB1"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 6.781 KB? ? ? 45 rows
?Master table "SYS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
?******************************************************************************
?Dump file set for SYS.SYS_EXPORT_SCHEMA_01 is:
? /home/oracle/chh/ad.adtab1.dmp
?Job "SYS"."SYS_EXPORT_SCHEMA_01" successfully completed at 09:22:14
注:上述导出操作如果由普通用户操作,那么必须赋予该用户exp_full_database权限,否则会触发如下错误
ORA-39165: Schema MNG was not found.
?ORA-39168: Object path INDEX was not found.
#####在导入目标库之前先将impdp的结果输出到脚本文件
impdp ad/123456 directory=tmpdir dumpfile=ad.adtab1.dmp logfile=imp_ad.adtab1.log sqlfile=ad.adtab1.sql
---ad.adtab1.sql文件内容中已经包含了create index的步骤
?。。。其它部分略
-- CONNECT MNG
?CREATE INDEX "MNG"."IND_ADTAB1_UID" ON "AD"."ADTAB1" ("USER_ID")
? PCTFREE 10 INITRANS 2 MAXTRANS 255
? STORAGE(INITIAL 8388608 NEXT 8388608 MINEXTENTS 1 MAXEXTENTS 2147483645
? PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
? BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
? TABLESPACE "TS_PUB" PARALLEL 1 ;
? ALTER INDEX "MNG"."IND_ADTAB1_UID" NOPARALLEL;
?CREATE INDEX "MNG"."IND_ADTAB1_CRT" ON "AD"."ADTAB1" ("CREATED")
? PCTFREE 10 INITRANS 2 MAXTRANS 255
? STORAGE(INITIAL 8388608 NEXT 8388608 MINEXTENTS 1 MAXEXTENTS 2147483645
? PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
? BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
? TABLESPACE "TS_PUB" PARALLEL 1 ;
? ALTER INDEX "MNG"."IND_ADTAB1_CRT" NOPARALLEL;
。。。其它部分略?
#####最后执行导入
---导入前赋予imp_full_database较色给ad,因为要导入的内容里包含了其它Schema信息
grant imp_full_database to ad;
---导入成功
impdp ad/123456 directory=tmpdir dumpfile=ad.adtab1.dmp logfile=imp_ad.adtab1.log
?Master table "AD"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
?Starting "AD"."SYS_IMPORT_FULL_01":? ad/******** directory=tmpdir dumpfile=ad.adtab1.dmp logfile=imp_ad.adtab1.log
?Processing object type SCHEMA_EXPORT/TABLE/TABLE
?Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
?. . imported "AD"."ADTAB1"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 6.781 KB? ? ? 45 rows
?Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
?Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
?Job "AD"."SYS_IMPORT_FULL_01" successfully completed at 09:35:56
####结果检查OK
?set linesize 180
?SQL> select count(*) from adtab1;
? COUNT(*)
?----------
? ? ? ? 45
? ? ? ?
?select owner,index_name,status,table_owner,table_name from dba_indexes where table_name='ADTAB1';
?OWNER? ? ? ? ? ? ? ? ? ? ? ? ? INDEX_NAME? ? ? ? ? ? ? ? ? ? STATUS? TABLE_OWNER? ? ? ? ? ? ? ? ? ? TABLE_NAME
?------------------------------ ------------------------------ -------- ------------------------------ ------------------------------
?MNG? ? ? ? ? ? ? ? ? ? ? ? ? ? IND_ADTAB1_CRT? ? ? ? ? ? ? ? VALID? ? AD? ? ? ? ? ? ? ? ? ? ? ? ? ? ADTAB1
?MNG? ? ? ? ? ? ? ? ? ? ? ? ? ? IND_ADTAB1_UID? ? ? ? ? ? ? ? VALID? ? AD? ? ? ? ? ? ? ? ? ? ? ? ? ? ADTAB1
总结:本例中导致ORA-39154的根本问题在于ad表上的索引没有建在ad用户下,这样的情况称为cross schema references,即不同schema的对象间存在关联,cross schema references导致的impdp错误还是比较隐蔽的,好在我们使用了sysdba权限从源库expdp导出表,然后通过impdp时有关统计信息无法导入的ORA-39154错误,一步一步追溯直至发现索引和表不在同一个schema下,问题才得以精确定位。这个案例也告诉我们在table mode export的方式下,如果依赖于a.taba表的对象,比如基于a.taba的索引名为index_b,建在了b用户下,那么下面的命令在导出结果里不会包含b用户下的索引
expdp user/passwd tables=a.taba directory=dirname dumpfile=a.taba.dmp logf