impdp错误如下:
IMP-00017: following statement failed with ORACLE error 959:
...
"DUIF1" LOGGING NOCOMPRESS )"
IMP-00003: ORACLE error 959 encountered
ORA-00959: tablespace 'TBS_LZL_OLD' does not exist
IMP-00017: following statement failed with ORACLE error 959:
错误显示表空间不存在
一般来说,这个问题应该是源端表空间存在,但是没有在目标端创建表空间,引起这个报错,只要创建好表空间,再执行导入就解决了。
但是,这里属于一个特殊情况,源端表空间也不存在,也就是TBS_LZL_OLD在源库中都不存在。
查询用户的默认表空间(实际上impdp导入表跟用户默认表空间没什么关系)
SQL> select USERNAME,DEFAULT_TABLESPACE from dba_users where USERNAME='USER_LZL';
USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
USER_LZL TBS_LZL_DUIF1
查询建表语句
CREATE TABLE "USER_LZL"."TI_LZL_SUB"
( "TRADEID" NUMBER(32,0) NOT NULL ENABLE,
...
STORAGE(
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TBS_LZL_OLD" LOCAL
查询源库中这个表的段存在哪
SQL> select OWNER,SEGMENT_NAME,PARTITION_NAME,TABLESPACE_NAME from dba_segments where OWNER='USER_LZL' and SEGMENT_NAME='TI_LZL_SUB';
OWNER SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ --------------------------------------------------------------------------------- ------------------------------ -------------------------
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_9 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_8 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_7 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_6 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_5 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_4 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_3 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_2 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_12 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_11 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_10 TBS_LZL_HDUIF1
USER_LZL TI_LZL_SUB PAR_TI_LZL_SUB_1 TBS_LZL_HDUIF1
也就是说这个表存储在TBS_LZL_HDUIF1表空间,但是ddl语句定义在TBS_LZL_OLD表空间。(所有跟用户默认表空间没关系)
TBS_LZL_HDUIF1表空间存在,但是TBS_LZL_OLD不存在。
impdp在导入表的元数据时的本质就是提取表的ddl语句在目标端中执行一次,所以impdp会报表空间不存在的错误
解决办法:
1.创建那个不存在的表空间,让ddl编译过去,但是实际上这个表空间不会被使用
2.提取ddl语句,手动更改ddl语句中的表空间,然后到目标端执行(不通过数据泵导元数据)
3.使用remap_tablespace参数
最简单方法就是3.使用remap_tablespace参数,把表空间转换到一个存在的表空间即可,比如TBS_LZL_HDUIF1
如下:
impdp \'/ as sysdba\' DIRECTORY=AWR_EXTR DUMPFILE=LZL_TBS.dmp logfile=LZL_TBS.log schemas=USER_LZL remap_tablespace=TBS_LZL_OLD:TBS_LZL_HDUIF1