Oracle数据库在使用数据泵导入dmp数据文件时报错。
导入之前已删除目标数据库的被导入用户。
错误信息:
ORA-39083: Object type USER failed to create with error:
ORA-00959: tablespace ‘TEMP1’ does not exist
Failing sql is:
CREATE USER “DATABUFF” IDENTIFIED BY VALUES ‘S:B27D8FB573BDBBBAE67BA0A5D896EAE1529D135E37C85E758FAB595B1A99;AEF687F6EC2CBAD6’ DEFAULT TABLESPACE “CAMS_DATABUFF_TAB” TEMPORARY TABLESPACE “TEMP1”
ORA-39083: Object type USER failed to create with error:
ORA-00959: tablespace ‘TEMP1’ does not exist
导入命令:
impdp system/123456@cams DIRECTORY=dpdata1 DUMPFILE=deskData202012021538.dmp SCHEMAS=db2odesk,sdata,databuff,work,report LOGFILE=impdp_deskData202012021538.log
知识点:
impdp命令在导入数据时,如果用户存在,则会自动创建该用户,因为expdp导出的dmp文件中包含了创建用户的脚本信息(包括密码,缺省表空间,临时表空间等)。
impdp自动创建用户有一个前提条件,就是需要首先创建用户的缺省表空间和临时表空间,如果缺省表空间或者临时表空间不存在,则自动创建用户会失败,导致导入数据的失败。
解决方案一:
将目标数据库的临时表空间名称改成和源数据库的临时表空间名称一致
1、查询用户表空间及默认表空间
SELECT USERNAME "用户名称", DEFAULT_TABLESPACE "默认表空间", TEMPORARY_TABLESPACE "临时表空间", ACCOUNT_STATUS "用户状态" FROM DBA_USERS ORDER BY 3,1;
2、修改用户临时表空间名称
ALTER TABLESPACE TEMP RENAME TO TEMP1;
解决方案二(未尝试)
表空间映射,使用数据泵中的remap_tablespace属性
导入命令如下:
impdp system/123456@cams DIRECTORY=dpdata1 DUMPFILE=deskData202012021538.dmp SCHEMAS=db2odesk,sdata,databuff,work,report remap_tablespace=TEMP1:TEMP LOGFILE=impdp_deskData202012021538.log
扩展:
删除用户时查询并删除用户会话:
SELECT 'ALTER SYSTEM KILL SESSION ''' || C.SID || '' || ',' || C.SERIAL# ||''';' FROM V$SESSION C WHERE USERNAME IN('DB2ODESK', 'SDATA', 'DATABUFF', 'WORK','REPORT');