expdp 不支持只导出表空间元数据,CONTENT=METADATA_ONLY 仅影响用户对象层级,不导出表空间 DDL;需用 DBMS_METADATA.GET_DDL('TABLESPACE','USERS') 获取可执行语句。
expdp 本身不支持「只导出表空间元数据」——它导出的是对象(表、索引、约束等)及其所属的表空间定义,但不会单独剥离出表空间本身的 create tablespace ddl。你真正能拿到的,是表空间名称、数据文件路径、大小、自动扩展等信息的「快照式描述」,藏在导出文件的元数据流里,无法直接提取为可执行 sql。
为什么不能用 CONTENT=METADATA_ONLY 导出表空间定义?
因为 CONTENT=METADATA_ONLY 只影响「用户对象层级」:它会跳过表数据,但仍导出该用户下所有表、索引、视图等的 DDL;它对表空间、用户、角色、profile 等数据库级对象完全无感——这些对象的定义根本不在这个参数控制范围内。
更关键的是:expdp 的导出粒度最小是 SCHEMAS 或 TABLESPACES,而 TABLESPACES 模式导出的是「该表空间内所有对象的元数据 + 数据」,不是表空间自身的创建语句。
所以如果你运行:
expdp system/password tablespaces=USERS content=metadata_only dumpfile=usrs_meta.dmp
结果仍是导出 USERS 表空间里所有用户的表结构,而不是 CREATE TABLESPACE USERS ... 这条语句。
真正能拿到表空间 DDL 的方式只有两个
必须绕开 expdp,改用 Oracle 自带的元数据提取工具:
-
DBMS_METADATA.GET_DDL('TABLESPACE', 'USERS'):直接返回可执行的CREATE TABLESPACE语句,含数据文件路径、大小、autoextend 等细节 -
DBMS_METADATA.GET_DDL('TABLESPACE_BITMAP', 'USERS'):如果表空间启用了本地管理位图(LMT),这个变体更准确
示例(在 SQL*Plus 或 SQL Developer 中执行):
SET LONG 2000000
SET PAGESIZE 0
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', 'USERS') FROM DUAL;
注意:GET_DDL 返回的是当前数据库中该表空间的「实时定义」,不依赖导出文件,也不受版本兼容性影响。
容易被忽略的关键点
表空间 DDL 里藏着几个极易出错的硬依赖项,导出后若直接在目标库执行,大概率失败:
- 数据文件路径(
DATAFILE '/u01/.../users01.dbf')在目标库可能不存在或权限不对,必须手动改成目标库实际路径 - 如果源库用 OMF(
DB_CREATE_FILE_DEST),DDL 里不会显式写路径,而是用SIZE 100M这类相对描述——此时需确保目标库也启用了 OMF,否则要补全绝对路径 - 非标准块大小(如 16K)的表空间,目标库必须已配置对应尺寸的
DB_nK_CACHE_SIZE参数,否则CREATE TABLESPACE会报 ORA-01219 -
EXTENT MANAGEMENT LOCAL AUTOALLOCATE和SEGMENT SPACE MANAGEMENT AUTO是现代默认值,但老库可能用MANUAL,迁移时需核对
别指望数据泵替你处理这些。它只管搬对象,不管基建。


















