CONTENT=METADATA_ONLY是expdp导出表空间结构最稳妥方式,完整导出DDL但不含数据行,需搭配SCHEMAS或TABLESPACES使用,且必须确保DIRECTORY授权、路径有效及PDB容器正确切换。
expdp CONTENT=METADATA_ONLY 导出表空间结构
直接用 expdp 加 content=metadata_only 是最稳妥的方式,它能完整导出表空间内所有对象的 ddl(含表、索引、约束、权限等),但不带任何数据行。
注意:该参数仅对 expdp 有效,exp 不支持;且必须搭配 TRANSPORT_TABLESPACE 或常规导出模式(如 SCHEMAS 或 TABLESPACES)一起使用。
-
expdp必须在数据库服务端执行,dump 文件也只存于服务端指定目录 - 目标表空间名需准确拼写,大小写敏感(尤其在区分大小写的文件系统上)
- 若导出多个表空间,用逗号分隔:
TABLESPACES=tbs1,tbs2 - 确保已创建并授权 DIRECTORY 对象,路径真实存在且 Oracle 进程有读写权限,否则报
ORA-39070或ORA-39002
exp rows=n 能否用于表空间级导出?
不能。exp 工具没有表空间级导出能力,它的 rows=n 参数只作用于表或用户模式导出,对表空间无意义。
如果你看到“exp ... rows=n 导出表空间结构”的说法,那其实是误用——实际导出的是某个用户下属于该表空间的全部对象(即按 owner + rows=n 模拟),但无法保证覆盖该表空间中跨 schema 的所有对象(比如 DBA 创建的公共同义词、SYS 下的系统表等)。
-
exp默认不支持TABLESPACES参数,强行指定会报错EXP-00019: invalid parameter -
exp的owner参数只能指定 schema,不是表空间名 - 依赖
rows=n的方式本质是“导出某用户所有对象结构”,不是“导出某表空间所有对象结构”
TRANSPORT_TABLESPACE=y 导出是否只含元数据?
是,但有前提:必须配合 transportable tablespace 流程使用,且导出时明确指定 TRANSPORT_TABLESPACE=y 和 TABLESPACES=xxx,此时 dump 文件里只含元数据(不含数据文件,也不含数据行)。
这种导出方式专为跨库迁移设计,生成的 dump 文件体积小、导入快,但要求源库中该表空间处于 READ ONLY 状态,且满足自包含性(transport_set_violations 查询为空)。
- 执行前必须先运行:
ALTER TABLESPACE xxx READ ONLY; - 检查自包含:
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('XXX', TRUE); SELECT * FROM TRANSPORT_SET_VIOLATIONS; -
TRANSPORT_TABLESPACE=y与CONTENT=METADATA_ONLY不能共存,否则报ORA-39001: invalid argument value - 导出命令示例:
exp "'/ as sysdba'" file=tbs_meta.dmp log=tbs_meta.log transport_tablespace=y tablespaces=USERS
容易忽略的权限和目录问题
哪怕参数全对,expdp 仍可能因权限或路径问题静默失败或中途退出,常见卡点不在语法而在环境配置。
- 创建 DIRECTORY 后,必须显式授权:
GRANT READ, WRITE ON DIRECTORY DUMP_DIR TO scott;(不能只靠 role) - 目录路径在操作系统中必须真实存在,且属主为
oracle用户,组为oinstall(chown oracle:oinstall /path/to/dir) - 如果使用 PDB,需先
ALTER SESSION SET CONTAINER=pdb_name;,否则导出的是 CDB root 中的对象 - 导出用户必须有
EXP_FULL_DATABASE角色(或至少SELECT_CATALOG_ROLE+ 对象级权限),否则部分系统对象 DDL 会缺失
真正麻烦的从来不是选哪个参数,而是目录没权限、PDB 切错了、表空间没设只读——这些细节一漏,dump 文件就缺关键约束或索引,后续导入直接报错。


















