RMAN不能导出数据库结构,仅exp和expdp支持:exp需用rows=n参数,expdp需用CONTENT=METADATA_ONLY参数,二者均需配合owner或SCHEMAS等限定范围,且导出文件为二进制.dmp,不可直接读取DDL。RMAN 不能导出数据库结构(DDL)。它不生成表定义、索引、约束或任何元数据脚本,也不支持
CONTENT=METADATA_ONLY 或 rows=n 这类逻辑导出控制。
如果你看到“用 RMAN 导出结构”的说法,基本是混淆了工具职责 —— RMAN 是物理备份工具,只备份数据文件、控制文件、归档日志等二进制块,**不解析、不提取、不生成 DDL**。
真正能导出结构(不含数据)的只有两类工具:传统 exp 和现代 expdp(data pump)。它们才是 oracle 官方认可的逻辑导出方案。
exp 命令怎么只导结构?
老式 exp 工具仍广泛用于 Oracle 11g 及更早版本,核心就靠 rows=n:
-
rows=n是唯一生效的“无数据”开关,必须显式指定 -
owner=xxx限定用户范围;full=y需SYSTEM或 DBA 权限,且会包含系统对象(如sys.aud$),导入时易报错 - 导出文件是二进制
.dmp,无法直接阅读,但可用imp show=y查看内容概要 - 常见错误:
EXP-00091: Exporting questionable statistics可忽略;若报ORA-01455(转换溢出),说明某张表统计信息异常,加statistics=none规避
示例命令:
exp system/manager@orcl full=y file=/tmp/schema.dmp log=/tmp/schema.log rows=n statistics=none
expdp 怎么只导结构?
Oracle 10g 起推荐用 expdp,关键参数是 CONTENT=METADATA_ONLY:
-
CONTENT=METADATA_ONLY明确只导 DDL,不含任何行数据,也不含 LOB 段物理分配信息(比rows=n更干净) - 必须提前创建 directory 对象(如
CREATE DIRECTORY dump_dir AS '/u01/dump';),且赋予读写权限 - 不支持
full=y直接等价替代 —— 全库需用SCHEMAS=列出所有用户,或用INCLUDE=SCHEMA:"IN (SELECT username FROM dba_users WHERE username NOT IN ('SYS','SYSTEM'))"动态过滤 - 默认导出触发器、约束、权限,若想跳过某些对象类型,用
EXCLUDE=TRIGGER或EXCLUDE=CONSTRAINT
示例命令:
expdp system/manager@orcl DIRECTORY=dump_dir DUMPFILE=schema_only.dmp LOGFILE=schema_only.log CONTENT=METADATA_ONLY SCHEMAS=scott,hr
导出后怎么验证没数据?
别信日志里 “Export terminated successfully” —— 要动手确认:
- 用
impdp加SQLFILE=ddl.sql参数,把 DDL 导出为可读 SQL 文件:impdp system/manager DIRECTORY=dump_dir DUMPFILE=schema_only.dmp SQLFILE=check.sql,然后 grepINSERT或VALUES,应为空 - 用
strings schema_only.dmp | head -20(Linux)粗略扫一眼,如果出现大量字段值或长文本,说明误导了数据 - 对比导出前后
dba_tables.num_rows—— 结构导出本身不影响源库,但这步能帮你建立检查习惯
最后提醒:无论 exp 还是 expdp,导出的 DMP 文件都依赖 Oracle 版本和字符集。跨版本迁移前务必测试导入,尤其注意 12c+ 的 PDB 容器上下文(alter session set container=... 必须设对),否则 ORA-39002 或 ORA-65096 会立刻出现。


















