菜鸟科技网

exp命令如何导出指定表?

基础概念:exp vs expdp

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

exp命令如何导出指定表?-图1
(图片来源网络,侵删)
特性 exp (传统导出) expdp (数据泵导出)
技术 客户端工具,通过 SQL*Net 连接 服务器端进程,通过目录对象工作
性能 较慢,受网络和客户端性能影响 非常快,直接在服务器端读写文件
功能 功能相对有限 功能强大,支持并行、传输表空间等高级特性
使用场景 小型数据量、简单导出、旧版本兼容 推荐用于所有生产环境、大型数据量导出
文件格式 通常是 .dmp 文件,但也支持其他格式 通常是 .dmp 文件

重要提示: Oracle 官方强烈推荐在生产环境中使用 expdpexp 主要用于向后兼容或处理非常简单的任务,但了解 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
  • parameters: 导出参数,用于指定导出什么、如何导出,参数可以写在命令行中,也可以放在一个参数文件里。

常用导出参数

exp 命令的核心在于各种参数,下面我们分类介绍最常用的参数。

参数 (决定导出什么)

这是最重要的参数组,你几乎总是需要指定其中一个。

exp命令如何导出指定表?-图2
(图片来源网络,侵删)
参数 说明 示例
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 用户的 empdept 表。

示例 1:最简单的导出(导出表数据)

# 在命令行中直接执行
exp scott/tiger@localhost:1521/XE tables=(emp,dept)
  • 效果: 将在当前目录下生成一个名为 expdat.dmp 的文件,并记录日志到 expdat.log,文件中只包含 empdept 表的数据和结构。

示例 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:使用参数文件(推荐用于复杂导出)

当导出参数很多时,在命令行中输入容易出错,使用参数文件是更好的方式。

  1. 创建参数文件 (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
  2. 执行导出命令:

    exp命令如何导出指定表?-图3
    (图片来源网络,侵删)
    # parfile= 指定参数文件名
    exp parfile=exp.par
  • 效果: 命令行变得非常简洁,参数易于管理和修改。

常见问题与注意事项

  1. ORA-00942: table or view does not exist

    • 原因: 你要导出的表不存在,或者你使用的用户没有权限访问该表。
    • 解决: 检查表名是否正确,并确保用户有 SELECT 权限,如果是导出其他用户的表,需要使用 FROMUSER 参数(见下文)。
  2. EXP-00056: ORACLE error 995 encountered

    • 原因: 这通常是 direct=y 模式下遇到不支持的列类型(LONG RAWBFILE 等)导致的。
    • 解决: 去掉 direct=y 参数,使用常规导出方式。
  3. 如何导出其他用户的表?

    • exp 命令本身没有 FROMUSER/TOUSER 这样的参数(这是 expdp 的功能),你需要先以具有 EXP_FULL_DATABASE 权限的用户(如 sys)登录,然后使用 FROMUSERTOUSER 参数。
    • 示例:
      # sys 用户执行
      exp sys/password@localhost:1521/XE tables=hr.employees fromuser=hr touser=scott
  4. 权限问题

    • 要执行 exp,用户通常需要 EXP_FULL_DATABASE 角色(对于 full=yowner=)或至少需要拥有要导出对象的 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 命令!

分享:
扫描分享到社交APP
上一篇
下一篇