CONTENT=METADATA_ONLY是导出表空间元数据的唯一可靠方式,必须搭配TABLESPACES参数使用,且仅适用于expdp;exp不支持表空间级导出,其rows=n对表空间无效。

CONTENT=METADATA_ONLY 是唯一可靠方式,但必须搭配 TABLESPACES 参数使用,且不能和 TRANSPORT_TABLESPACE=y 共存。
必须用 expdp,exp 不支持表空间级元数据导出
看到“exp rows=n 导出表空间结构”都是误解。因为 exp 根本没有 TABLESPACES 参数,强行指定会报 EXP-00019: invalid parameter;它只能按 owner(用户)导出,哪怕该用户对象全在某个表空间里,也漏掉 SYS、DBA 下的同义词、系统表等跨 schema 对象。
-
exp的rows=n只对owner或tables有效,对表空间无意义 -
exp在 Oracle 10g+ 无法导出空表(0 行),而expdp没这个问题 -
expdp是服务端工具,dump 文件只生成在数据库服务器上,不是客户端本地
TABLESPACES + CONTENT=METADATA_ONLY 是标准组合
这是最直接、覆盖最全的方式,能导出表空间内所有 schema 的对象定义:表、索引、约束、触发器、权限、物化视图日志等,不含任何数据行。
- 命令格式:
expdp / as sysdba TABLESPACES=tbs1,tbs2 CONTENT=METADATA_ONLY DIRECTORY=dir_obj DUMPFILE=tbs_meta.dmp LOGFILE=tbs_meta.log -
TABLESPACES值大小写敏感,尤其在 Linux/Unix 上,拼错就报ORA-39168: Object type TABLESPACE:"tbs1" not found - 多个表空间用英文逗号分隔,**不能有空格**:
TABLESPACES=tbs1,tbs2✅,TABLESPACES=tbs1, tbs2❌ - 必须用
sysdba或具备EXP_FULL_DATABASE权限的用户执行,普通用户即使有表空间 quota 也不行
DIRECTORY 必须提前创建并授权,且路径真实可写
expdp 不检查 OS 目录是否存在,只查数据字典里的 DBA_DIRECTORIES。目录对象存在但对应 OS 路径不存在或权限不足,会立即失败。
- 先在操作系统创建路径:
mkdir -p /u01/dump,再chown oracle:oinstall /u01/dump - 再建目录对象:
CREATE OR REPLACE DIRECTORY dump_dir AS '/u01/dump'; - 授权(注意是
READ和WRITE,不是SELECT):GRANT READ, WRITE ON DIRECTORY dump_dir TO system; - 常见错误:
ORA-39070: Unable to open the log file或ORA-39002: Invalid operation,基本就是这个环节出问题
别误用 TRANSPORT_TABLESPACE=y
它也能导出元数据,但目的和流程完全不同:专为可传输表空间(TTS)迁移设计,要求源表空间 READ ONLY、自包含(TRANSPORT_SET_VIOLATIONS 查询为空),且和 CONTENT=METADATA_ONLY 互斥——共存直接报 ORA-39001: invalid argument value。
- 如果你只是要一份 DDL 脚本或做结构比对,
TRANSPORT_TABLESPACE=y是过度设计,还多两步强制操作 - 它导出的 dump 文件不包含数据文件,但元数据结构和
CONTENT=METADATA_ONLY一致,只是适用场景窄得多 - 真要用它,必须先:
ALTER TABLESPACE tbs1 READ ONLY;,再运行DBMS_TTS.TRANSPORT_SET_CHECK检查


















