可传输表空间导入报错ORA-39070、ORA-39087求助
解决Oracle TTS导入的ORA-39002/ORA-39070/ORA-39087错误
核心原因分析
ORA-39087提示目录名无效,说明数据库无法识别DIR_PDB1目录对象,通常和目录创建的容器错误、权限不足或操作系统目录配置问题有关;ORA-39070是前者引发的连锁错误,ORA-39002则可能因TTS导入必备参数缺失导致。
分步解决方案
1. 确保目录对象在目标PDB中创建
TTS导入针对PDB1操作,目录对象必须在PDB1容器内创建,而非CDB$ROOT:
-- 切换到PDB1容器 ALTER SESSION SET CONTAINER=PDB1; -- 重新创建目录(务必在PDB1会话内执行) CREATE OR REPLACE DIRECTORY DIR_PDB1 AS '/u01/app/oracle/oradata/ORCL/pdb1/DIR_PDB1';
2. 验证目录对象的有效性
在PDB1容器内执行查询,确认目录已正确创建:
SELECT DIRECTORY_NAME, DIRECTORY_PATH FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = 'DIR_PDB1';
若查询无结果,说明目录未在PDB1中创建,重复步骤1。
3. 修复操作系统目录权限
确保Oracle用户对操作系统层面的DIR_PDB1目录拥有读写权限:
# 切换至root用户执行 chown oracle:oinstall /u01/app/oracle/oradata/ORCL/pdb1/DIR_PDB1 chmod 755 /u01/app/oracle/oradata/ORCL/pdb1/DIR_PDB1
4. 授予目录读写权限给导入用户
给执行impdp的用户授予目录的读写权限(若用SYSDBA执行,需确保在PDB1会话内操作):
ALTER SESSION SET CONTAINER=PDB1; GRANT READ, WRITE ON DIRECTORY DIR_PDB1 TO 你的导入用户名;
5. 修正impdp命令参数
TTS导入必须指定transport_datafiles,同时规范参数格式:
# 标准TTS导入命令示例(需在PDB1对应的环境下执行) impdp 用户名/密码@PDB1 DIRECTORY=DIR_PDB1 DUMPFILE=T1.dmp NOLOGFILE=Y JOB_NAME=imp_T1 TRANSPORT_DATAFILES='/u01/app/oracle/oradata/ORCL/pdb1/T1.dbf'
注意事项:
DIRECTORY与=之间不要加空格,避免解析异常NOLOGFILE需明确指定值(Y/N),简写可能触发参数错误- 必须包含
TRANSPORT_DATAFILES,否则会触发ORA-39002无效操作错误
额外排查点
- 若数据库启用大小写敏感标识符,创建目录时用小写名称需加双引号(如
CREATE DIRECTORY "dir_pdb1" AS ...),此时impdp命令中也要用双引号指定目录名 - 确认
T1.dmp是源数据库导出的TTS专用dump文件,而非普通导出文件
内容的提问来源于stack exchange,提问作者Gustian
相关产品推荐
相关产品推荐

