在Linux环境下使用Oracle数据库进行数据导出时,通常会通过exp(Export)和expdp(Data Pump Export)命令实现,其中expdp是Oracle推荐的高性能工具,支持并行处理和更丰富的功能,以下是详细的使用说明及操作示例。

传统导出命令(exp)
exp命令是Oracle早期提供的导出工具,适用于较小规模的数据导出,语法简单但功能有限,基本语法为:
exp 用户名/密码@数据库连接标识 file=导出文件名.dmp log=日志文件名.log 参数
常用参数包括:
- full=y:完整导出数据库(需DBA权限)
- owner=用户名:导出指定用户的所有对象
- tables=表名1,表名2:导出指定表
- rows=y/n:是否导出数据(默认为y)
- indexes=y/n:是否导出索引(默认为y)
- grants=y/n:是否导出权限(默认为y)
示例1:导出scott用户的所有数据:
exp scott/tiger@orcl file=scott_data.dmp log=scott_exp.log owner=scott
示例2:导出指定表(emp和dept):

exp scott/tiger@orcl file=tables.dmp log=tables_exp.log tables=emp,dept
数据泵导出命令(expdp)
expdp是Oracle 10g后推出的数据泵工具,需通过DBMS_DATAPUMP包实现,性能远高于exp,使用前需确保:
- 创建目录对象(需DBA权限):
CREATE DIRECTORY dump_dir AS '/u01/oracle/dump'; GRANT READ, WRITE ON DIRECTORY dump_dir TO scott;
- 设置环境变量
ORACLE_SID和ORACLE_HOME。
基本语法:
expdp 用户名/密码@数据库连接标识 dumpfile=导出文件名.dmp logfile=日志文件名.log 参数
核心参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
| full=y | 全库导出 | expdp system/manager@orcl full=y dumpdb=full.dmp |
| schemas=用户名 | 导出指定用户 | expdp scott/tiger@orcl schemas=scott dumpfile=scott.dmp |
| tables=表名 | 导出指定表 | expdp scott/tiger@orcl tables=emp dumpfile=emp.dmp |
| directory=目录对象 | 指定导出路径 | expdp scott/tiger@orcl directory=dump_dir dumpfile=emp.dmp |
| parallel=线程数 | 并行导出线程数 | expdp scott/tiger@orcl parallel=4 dumpfile=exp%U.dmp |
| filesize=大小 | 单个文件大小(如1G) | expdp system/manager@orcl filesize=1G dumpfile=exp%U.dmp |
| content=data_only | 仅导出数据(不含结构) | expdp scott/tiger@orcl content=data_only tables=emp |
| exclude=object_type | 排除特定对象类型 | expdp scott/tiger@orcl exclude=index dumpfile=exp.dmp |
示例1:并行导出scott用户的所有数据,按1GB分割文件:
expdp scott/tiger@orcl schemas=scott directory=dump_dir dumpfile=scott_%U.dmp parallel=4 filesize=1G
示例2:导出表emp并排除索引:

expdp scott/tiger@orcl tables=emp directory=dump_dir dumpfile=emp_no_idx.dmp exclude=index
示例3:按查询条件导出数据(需使用query参数):
expdp scott/tiger@orcl tables=emp directory=dump_dir dumpfile=emp_query.dmp query=\"WHERE deptno=10\"
注意事项
- 权限问题:
expdp需用户有EXP_FULL_DATABASE角色,exp需相应对象的EXP权限。 - 路径权限:Linux目录需赋予Oracle用户读写权限(如
chmod 777 /u01/oracle/dump)。 - 字符集:导出文件字符集需与目标库兼容,可通过
expdp ... character-set=AL32UTF8指定。 - 网络导出:通过
network_link参数可跨库导出,如expdp system/manager@orcl network_link=remote_db ...。
FAQs
Q1: 如何处理expdp导出时“ORA-39002: 参数无效”错误?
A: 通常因参数格式错误或目录对象未创建导致,检查步骤:
- 确认目录对象存在且授权:
SELECT * FROM all_directories WHERE directory_name='DUMP_DIR'; - 检查参数拼写(如
directory而非dir); - 确保Linux路径路径与目录对象路径一致,且Oracle用户有权限访问。
Q2: expdp导出大表时如何避免因表锁定影响业务?
A: 数据泵默认使用TABLE_EXPORT/TABLE/TABLE_DATA模式,可通过FLASHBACK_SCN或FLASHBACK_TIME实现一致性导出:
expdp scott/tiger@orcl tables=large_table directory=dump_dir dumpfile=large.dmp flashback_time="SYSTIMESTAMP-1/24"
该参数会通过SCN快照获取导出时的数据一致性视图,避免锁表,若数据量极大,建议在业务低峰期执行。
