导出11g服务器数据库,优先在服务器端用数据泵expdp,先建目录对象、授读写权限,再按用户或表导出;数据量小或只能本地连远程库时,用老式exp客户端命令也能完成。两种方式都能生成dmp文件,区别在于执行位置、性能和参数写法,下面按实操顺序拆开讲,命令可以直接照着改。
先搞清11g导出到底有哪几种方式
Oracle 11g里常用的导出工具就两个:exp和expdp,前者是传统客户端工具,后者是服务端数据泵,选错了工具,后面参数、权限、日志路径全对不上。
Oracle 11g exp和expdp导出区别
行业共识认为,expdp在11g中已经是主流方案,因为它走服务器进程、支持并行、能细粒度过滤,exp更像“老式直连导出”,适合临时取数或客户端版本受限的场景,对比看下表:
| 对比项 | exp | expdp |
|---|---|---|
| 执行位置 | 客户端或服务器均可 | 必须在服务器端执行 |
| 目录要求 | 直接写文件路径 | 必须先建DIRECTORY对象 |
| 性能 | 单线程,数据量大时偏慢 | 支持并行,整体更快 |
| 过滤能力 | 支持owner、tables、query | 支持schemas、tables、query、content |
| 日志 | 屏幕输出或log参数 | logfile参数,日志更完整 |
| 典型场景 | 小表、本地连远程库 | 整库、按用户、按表结构导出 |
如果你只导几张配置表,exp敲一行就完事;如果要导整个业务用户,expdp更稳。
导出前必须确认的三件事
- 确认版本和字符集:
select from v$version;和select from nls_database_parameters where parameter='NLS_CHARACTERSET';导出端和导入端字符集不一致,中文容易乱码。 - 确认磁盘空间:dmp文件大小通常接近数据量本身,加上日志和索引,预留空间要大于源库该用户占用空间,近年来不少导出失败不是权限问题,而是挂载点写满。
- 确认用户权限:普通用户只能导自己schema下的对象;导全库或其他用户,需要
EXP_FULL_DATABASE角色或DBA权限。
用expdp导出11g数据库的完整操作路径
这套流程在11g R2上通用,命令里的用户名、服务名、路径换成你的即可。
第一步:在服务器上创建目录对象并授权
用sysdba登录服务器:
sqlplus / as sysdba create or replace directory dump_dir as '/u01/app/oracle/dump'; grant read,write on directory dump_dir to scott;
注意/u01/app/oracle/dump这个路径必须真实存在,且Oracle操作系统用户有写权限,建完可以查:
select from dba_directories where directory_name='DUMP_DIR';
第二步:给导出用户授予必要权限
按用户导出自己的数据,通常不需要额外角色,如果导全库:
grant exp_full_database to scott;
如果只导自己schema,跳过这步也行,权限不够时,expdp会直接报ORA-39127或ORA-31631,先看报错再补权限。
第三步:执行导出命令
按用户导出最常用:
expdp scott/tiger@orcl directory=dump_dir dumpfile=scott_20260101.dmp logfile=scott_20260101.log schemas=scott
几个关键参数:
schemas=scott:导scott用户下所有对象。dumpfile和logfile:只写文件名,不写路径,路径由DIRECTORY决定。- 加
parallel=2可以并行,但dumpfile要写成scott_%U.dmp格式。 - 只导表结构:加
content=metadata_only。 - 只导数据不要结构:加
content=data_only。 - 按表过滤:
tables=emp,dept。 - 按条件过滤:
query=scott.emp:"where hiredate>to_date('2020-01-01','yyyy-mm-dd')"。
第四步:检查日志和dmp文件
导出完成后别只看屏幕上的“successfully completed”,进目录看文件大小:
ls -lh /u01/app/oracle/dump/scott_20260101.dmp tail -50 /u01/app/oracle/dump/scott_20260101.log
日志里重点看有没有ORA-开头的错误、导出的对象数量、是否有对象被跳过,dmp文件大小为0或几KB,基本就是没导出来。
怎么把11g服务器数据库导出到本地并验证
很多人的真实需求不是“在服务器上留个dmp”,而是要把文件拿到本地开发机或测试库,这里分两步:先导到服务器目录,再下载到本地。
通过FTP或SCP下载dmp文件
服务器能直连的情况下,scp最省事:
scp oracle@192.168.1.100:/u01/app/oracle/dump/scott_20260101.dmp ./
如果服务器只开了FTP,用二进制模式传输,别用ASCII模式,否则dmp文件会被改坏,下载后核对文件大小和服务器端一致。
本地用impdp导入验证
本地装好同版本或更高版本Oracle客户端/服务端,建好目录对象后执行:
impdp scott/tiger@本地服务名 directory=local_dir dumpfile=scott_20260101.dmp logfile=imp_scott.log
只想看dmp里有什么,不真正导入,可以用sqlfile参数把DDL抽出来:
impdp scott/tiger@本地服务名 directory=local_dir dumpfile=scott_20260101.dmp sqlfile=scott_ddl.sql
这条命令只生成SQL文件,不动数据库,适合先检查对象是否完整。
Oracle 11g数据库导出表结构命令与过滤技巧
只导表结构不导数据,在迁移和比对场景里很常见,expdp用content=metadata_only,exp用rows=n。
只导表结构不导数据
expdp写法:
expdp scott/tiger@orcl directory=dump_dir dumpfile=scott_meta.dmp logfile=scott_meta.log schemas=scott content=metadata_only
exp写法:
exp scott/tiger@192.168.1.100:1521/orcl file=scott_meta.dmp owner=scott rows=n
前者在服务器执行,后者可以在本地客户端执行,只导结构时,dmp文件通常很小,传输快,适合先在新环境建空库。
按表名或用户过滤的写法
- 导指定表:
tables=emp,dept - 导指定用户:
schemas=scott,hr - 排除某张表:11g expdp不直接支持exclude表,可以用
tables列出要导的表,或者用query加条件绕开。 - 导表结构加部分数据:
content=all配合query,只导符合条件的数据行。
如果表很多,把表名写进参数文件更清爽:
expdp scott/tiger@orcl parfile=exp.par
exp.par里写:
directory=dump_dir dumpfile=scott_tables.dmp logfile=scott_tables.log tables=emp,dept,bonus content=metadata_only
导出过程中最容易踩的坑
权限不足报ORA-39127
典型原因是用户没有读目录对象的权限,或者路径属主不对,检查dba_directories里的路径,用ls -ld看Oracle用户能不能进去,补grant read,write on directory后重试。
目录对象路径不对
建DIRECTORY时写的是服务器绝对路径,不是客户端路径,在本地执行expdp却指向本地目录,必然报错,expdp只认服务器端目录。
字符集不一致
导出前设置NLS_LANG,
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
源库和目标库字符集不同时,导入后中文可能变问号,导出日志里会记录字符集信息,迁移前先比对。
版本兼容问题
11g导出的dmp,导入到11g或更高版本通常没问题;把高版本dmp往11g低版本导,多数情况下会失败,业内专家指出,跨版本迁移优先用expdp,并在目标端用同版本或更高版本的impdp。
导出11g服务器数据库不是一条命令的事,核心就三件事:选对expdp或exp、把目录对象和权限配好、导出后看日志和文件大小,按上面的路径走一遍,整库、单用户、只导表结构都能覆盖。
关于11g服务器数据库导出的常见问答
导出11g数据库时expdp报ORA-39002和ORA-39070怎么办?
这两个报错通常连着出现,指向目录对象或日志文件打不开,先查dba_directories里路径是否存在,再确认Oracle操作系统用户对目录有写权限,最后看磁盘是不是满了,路径和权限修好后重新执行,不需要重启数据库。
11g服务器数据库导出到另一台服务器要注意什么?
目标端Oracle版本不能低于源端,字符集要一致或兼容,目标端预留空间要大于dmp文件体积,传输用二进制模式,导入前先在目标端建好DIRECTORY对象,如果只迁移一个用户,源端按schemas导出,目标端按remap_schema导入即可。
只导出部分表数据,用exp还是expdp更合适?
表少、数据量小、本地能直连服务器,用exp敲一行更快;表多、要走过滤条件、需要并行,用expdp,11g环境下expdp的tables和query参数组合更灵活,日志也更完整,排错时省时间。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/791829.html


