直接调用DBMS_METADATA.GET_DDL('TABLESPACE','TBS_NAME')可获取表空间定义,无需schema参数;需设置SET LONG 100000等SQL*Plus参数避免截断和格式混乱;导出时视图名DBA_TABLESPACES须大写;默认含STORAGE等物理属性,可用SET_TRANSFORM_PARAM关闭;QUOTA信息需单独提取。

直接调用 DBMS_METADATA.GET_DDL('TABLESPACE', 'TBS_NAME') 就能拿到表空间定义
不需要指定 owner 或 schema 参数,表空间是数据库级对象,GET_DDL 的第三个参数(schema)会被忽略。只要当前用户有 SELECT_CATALOG_ROLE 或 DBA 权限,就能查任意表空间。比如:SELECT DBMS_METADATA.GET_DDL('TABLESPACE', 'USERS') FROM DUAL; 会返回完整的 CREATE TABLESPACE USERS ... 语句。
必须提前设置 SET LONG 100000,否则 DDL 被截断
表空间 DDL 常含大量 DATAFILE 列表、EXTENT MANAGEMENT 和 SEGMENT SPACE MANAGEMENT 子句,CLOB 默认只显示前 80 字符。不设 LONG,你看到的可能只有 CREATE TABLESPACE USERS 开头一两行。
以下 SQL*Plus 环境参数缺一不可:
SET LONG 100000SET PAGESIZE 0SET FEEDBACK OFFSET ECHO OFF
导出所有表空间时,DBA_TABLESPACES 视图名必须大写且不能加引号
批量导出常用写法:SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name) FROM DBA_TABLESPACES TS;
注意:
-
DBA_TABLESPACES是视图名,必须全大写;小写或带引号(如"dba_tablespaces")会报 ORA-00942 -
TS.tablespace_name返回的是大写名称,所以传给GET_DDL安全;如果手动拼写,'users'小写会触发 ORA-31603,必须写成'USERS' - 该查询对 SYSAUX、SYSTEM、UNDO 表空间同样有效,但部分特殊表空间(如 TEMP)DDL 可能不含
DATAFILE而是依赖实例参数,属正常行为
生成的 DDL 默认含 STORAGE 和 TABLESPACE 物理属性,迁移时通常要关掉
GET_DDL 默认输出包含存储细节,比如:DEFAULT STORAGE ( INITIAL 65536 NEXT 1048576 ... )
这类参数在跨平台或新版 Oracle 迁移时容易引发兼容性问题。解决方式是执行:EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE);
再调用 GET_DDL,就能去掉 storage、tablespace、logging 等物理层描述,只保留逻辑结构(如 CREATE TABLESPACE USERS EXTENT MANAGEMENT LOCAL)。这个开关是 session 级的,每次连接后需重设。
真正容易被忽略的是:表空间 DDL 不包含配额(QUOTA)信息——那是用户级配置,得用 DBMS_METADATA.GET_GRANTED_DDL('TABLESPACE_QUOTA', 'USERNAME') 单独提取,而且它只返回第一个配额,多个表空间配额需额外处理。


















