基础概念:exp vs expdp
在学习 exp 之前,你需要了解一个重要的概念:exp 是传统的导出工具,而 expdp 是数据泵导出工具。

| 特性 | exp (传统导出) |
expdp (数据泵导出) |
|---|---|---|
| 技术 | 客户端工具,通过 SQL*Net 连接 | 服务器端进程,通过目录对象工作 |
| 性能 | 较慢,受网络和客户端性能影响 | 非常快,直接在服务器端读写文件 |
| 功能 | 功能相对有限 | 功能强大,支持并行、传输表空间等高级特性 |
| 使用场景 | 小型数据量、简单导出、旧版本兼容 | 推荐用于所有生产环境、大型数据量导出 |
| 文件格式 | 通常是 .dmp 文件,但也支持其他格式 |
通常是 .dmp 文件 |
重要提示: Oracle 官方强烈推荐在生产环境中使用 expdp。exp 主要用于向后兼容或处理非常简单的任务,但了解 exp 仍然是有价值的,因为它在很多旧系统中仍在使用。
exp 命令基本语法
exp 命令在命令行(Windows 的 CMD 或 Linux/macOS 的 Terminal)中执行。
exp username/password@connect parameters
- username/password@connect: 这是连接数据库的凭证。
username: 数据库用户名。password: 对应的密码。@connect: 这是连接标识符,可以是:- TNS 别名:
@orcl(需要配置tnsnames.ora文件)。 - Easy Connect:
//localhost:1521/XE(无需配置文件,推荐使用)。 - 直接服务名:
@orclpdb1。
- TNS 别名:
- parameters: 导出参数,用于指定导出什么、如何导出,参数可以写在命令行中,也可以放在一个参数文件里。
常用导出参数
exp 命令的核心在于各种参数,下面我们分类介绍最常用的参数。
参数 (决定导出什么)
这是最重要的参数组,你几乎总是需要指定其中一个。

| 参数 | 说明 | 示例 |
|---|---|---|
tables |
导出指定的表,可以指定一个或多个表,用逗号分隔。 | tables=emp,dept |
owner |
导出指定用户的所有对象(表、索引、权限等)。 | owner=scott |
full=y |
导出整个数据库,需要 DBA 权限。 |
full=y |
rows=n |
只导出对象的结构(DDL),不导出数据,常用于备份数据库结构。 | rows=n |
导出行为参数 (决定如何导出)
| 参数 | 说明 | 示例 |
|---|---|---|
file |
指定导出文件的路径和名称,默认为 expdat.dmp。 |
file=/path/to/backup.dmp |
log |
指定日志文件的路径和名称,强烈建议使用,用于记录导出过程。 | log=/path/to/backup.log |
direct=y |
直接路径导出,绕过 SQL 层,直接读取数据文件,速度极快,但有一些限制(例如不能导出触发器)。 | direct=y |
grants=y |
导出权限和角色,默认为 y。 |
grants=y |
indexes=n |
不导出索引定义,默认为 y。 |
indexes=n |
constraints=y |
导出约束(主键、外键等),默认为 y。 |
constraints=y |
buffer |
设置数组插入缓冲区的大小,较大的值可以提高导出速度。 | buffer=64000 |
实用示例
假设我们要导出 scott 用户的 emp 和 dept 表。
示例 1:最简单的导出(导出表数据)
# 在命令行中直接执行 exp scott/tiger@localhost:1521/XE tables=(emp,dept)
- 效果: 将在当前目录下生成一个名为
expdat.dmp的文件,并记录日志到expdat.log,文件中只包含emp和dept表的数据和结构。
示例 2:指定导出文件和日志文件路径
# Windows 示例 exp scott/tiger@localhost:1521/XE tables=(emp,dept) file=C:\backup\scott_tables.dmp log=C:\backup\scott_tables.log # Linux/macOS 示例 exp scott/tiger@//localhost:1521/XE tables=(emp,dept) file=/home/oracle/backup/scott_tables.dmp log=/home/oracle/backup/scott_tables.log
- 效果: 导出数据到指定的文件和日志文件,路径清晰,便于管理。
示例 3:只导出表结构,不导出数据
exp scott/tiger@localhost:1521/XE tables=(emp,dept) rows=n
- 效果: 生成的
.dmp文件中只有CREATE TABLE语句,没有INSERT语句,这在需要快速重建表结构时非常有用。
示例 4:使用直接路径模式快速导出
exp scott/tiger@localhost:1521/XE tables=(emp,dept) direct=y
- 效果: 导出速度会快很多,但要注意
direct=y模式下不会导出触发器,并且对数据类型有一定限制,对于简单的表导出,这是一个很好的选择。
示例 5:导出整个用户的所有对象
exp scott/tiger@localhost:1521/XE owner=scott
- 效果: 这会导出
scott用户下的所有表、视图、索引、序列、存储过程、权限等,相当于一个用户级别的完整备份。
示例 6:使用参数文件(推荐用于复杂导出)
当导出参数很多时,在命令行中输入容易出错,使用参数文件是更好的方式。
-
创建参数文件 (
exp.par):# exp.par 参数文件 userid=scott/tiger@localhost:1521/XE owner=scott file=/home/oracle/backup/scott_full.dmp log=/home/oracle/backup/scott_full.log grants=y indexes=y rows=y
-
执行导出命令:
(图片来源网络,侵删)# parfile= 指定参数文件名 exp parfile=exp.par
- 效果: 命令行变得非常简洁,参数易于管理和修改。
常见问题与注意事项
-
ORA-00942: table or view does not exist- 原因: 你要导出的表不存在,或者你使用的用户没有权限访问该表。
- 解决: 检查表名是否正确,并确保用户有
SELECT权限,如果是导出其他用户的表,需要使用FROMUSER参数(见下文)。
-
EXP-00056: ORACLE error 995 encountered- 原因: 这通常是
direct=y模式下遇到不支持的列类型(LONG RAW、BFILE等)导致的。 - 解决: 去掉
direct=y参数,使用常规导出方式。
- 原因: 这通常是
-
如何导出其他用户的表?
exp命令本身没有FROMUSER/TOUSER这样的参数(这是expdp的功能),你需要先以具有EXP_FULL_DATABASE权限的用户(如sys)登录,然后使用FROMUSER和TOUSER参数。- 示例:
# sys 用户执行 exp sys/password@localhost:1521/XE tables=hr.employees fromuser=hr touser=scott
-
权限问题
- 要执行
exp,用户通常需要EXP_FULL_DATABASE角色(对于full=y或owner=)或至少需要拥有要导出对象的SELECT权限(对于tables=)。
- 要执行
总结与最佳实践
| 场景 | 推荐命令/方法 | 说明 |
|---|---|---|
| 快速导出几个表 | exp user/pwd tables=(t1,t2) |
简单直接。 |
| 需要详细日志和自定义路径 | exp user/pwd tables=(t1,t2) file=... log=... |
生产环境推荐。 |
| 追求极致速度 | exp user/pwd tables=(t1,t2) direct=y |
注意 direct=y 的限制。 |
| 备份数据库结构 | exp user/pwd rows=n |
快速获取 DDL。 |
| 完整备份用户 | exp user/pwd owner=user |
包含该用户的所有对象。 |
| 复杂导出任务 | 使用参数文件 (exp parfile=...) |
管理方便,不易出错。 |
| 生产环境/大数据量 | 强烈建议使用 expdp |
性能、功能、可靠性远超 exp。 |
希望这份详细的指南能帮助你熟练掌握 exp 命令!
