简介这是一款基于Java编写的Oracle数据库导入导出桌面工具面向数据库运维人员、开发工程师及对命令行操作不熟悉的初学者用于解决数据迁移、备份恢复、离线分析等场景下的导入导出需求。压缩包共198个文件约45.31MB以68个dll、25个jar、24个properties、22个exe及字体、证书、配置等支持文件为主构成完整的Java运行与图形界面环境其中jre相关组件是程序启动的必要条件不建议删除。工具提供直观的操作界面支持设置表空间、用户密码、数据文件路径、表或模式、压缩选项等参数并配套操作说明文档涵盖启动流程、注意事项与常见错误处理帮助用户规避权限与数据格式问题。目前已有1985人学习下载适合希望以图形化方式简化expdp、impdp等操作、提升Oracle数据管理效率的读者参考使用。1. Oracle 数据库导入导出工具从 exp/imp 到数据泵的选型与落地凌晨两点生产库要迁到新机房开发同事丢过来一句“用 exp 导一下就行”结果 80G 的表空间导到一半报错中断回滚又回滚不干净——这种场景我经历过不止一次。Oracle 数据库导入导出工具说的就是解决这类数据搬运问题的整套手段逻辑备份、跨库迁移、按表/按用户/按表空间抽取、增量同步。它要解决的核心诉求很具体——把数据从 A 库搬到 B 库或者把一份快照存下来同时保证字符集、权限、约束、序列值不丢。适合谁DBA、后端开发、做数据迁移和数据库课程设计的同学以及需要定期做逻辑备份的运维。选错工具轻则慢重则数据对不上这篇就把选型、命令、参数和踩坑一次讲清。2. 先分清 exp/imp 与 expdp/impdp两代工具的边界在哪Oracle 的导入导出工具分两代老一代是 exp/imp客户端工具新一代是数据泵 expdp/impdp服务端工具。很多人上手就混用结果在 19c 上踩坑。这一章先把两代工具的定位、适用场景和最小可跑命令讲透再谈怎么选。2.1 两代工具的本质区别与选型判断exp/imp 是客户端程序数据流经过客户端进程导出文件写在客户端机器上expdp/impdp 是服务端程序实际执行在数据库服务器上文件写在服务器目录DIRECTORY 对象指向的路径客户端只是发指令。这个区别决定了几件事性能数据泵走服务端直接读写绕开客户端网络往返大库导出通常快数倍。文件位置exp 的文件在你执行命令的机器上expdp 的文件在服务器上除非你映射了目录。版本兼容exp/imp 跨版本兼容性更好老库如 10g、11g往新库搬exp/imp 往往更省心expdp/impdp 要求目标库版本不低于源库且需要 DIRECTORY 权限。功能数据泵支持并行、压缩、重映射表空间/用户、按查询条件导出QUERY 参数exp 基本没有。选型判断很简单同版本或新库之间搬大数据用数据泵跨大版本、老库、临时小表用 exp/imp 更稳。别迷信“新的一定好”我见过 11g 往 19c 搬用 expdp 直接报版本不兼容换 exp 反而一次过。2.2 exp/imp 最小可跑命令与关键参数先看传统 exp 的典型用法。下面这条命令导出一个用户的全部对象# 导出 scott 用户的全部对象到文件日志单独记录 exp scott/tigerorcl \ file/backup/scott_full.dmp \ log/backup/scott_full.log \ ownerscott \ buffer10485760 \ compressn \ grantsy \ indexesy逻辑说明ownerscott指定按用户导出只导该用户下的对象buffer是数据缓冲区大小默认偏小大表导出时调大能减少 I/O 次数compressn表示不把数据压进初始区段老参数现代版本基本保持 ngrantsy和indexesy保证权限和索引一起导出否则导入后还得手工补。参数说明file是导出文件路径log是日志出问题先看日志。rowsy是默认值导数据如果只想导结构设rowsn。consistenty在导出期间保持读一致性但需要回滚段空间大库慎用。导入用 imp对应命令# 把 dmp 导入到目标库的 scott 用户 imp scott/tigertargetdb \ file/backup/scott_full.dmp \ log/backup/scott_imp.log \ fromuserscott \ touserscott \ commity \ ignoreyfromuser/touser支持跨用户导入比如从 scott 导到 scott_newcommity表示每插入一批就提交避免大事务撑爆回滚段ignorey忽略“对象已存在”的错误常用于补数据。注意ignorey不是万能的遇到表结构冲突它不会帮你改只会跳过。2.3 expdp/impdp 的目录对象与最小命令数据泵必须先建 DIRECTORY 对象这是新手最容易卡住的地方。DIRECTORY 是数据库里的一个逻辑名指向服务器上的物理路径且 Oracle 进程要有该路径的读写权限。-- 在数据库中创建目录对象并授权 CREATE OR REPLACE DIRECTORY dpdir AS /data/dump; GRANT READ, WRITE ON DIRECTORY dpdir TO scott;逻辑说明/data/dump必须是数据库服务器上真实存在的目录且 oracle 操作系统用户对其有读写权限否则导出时报 ORA-39002 / ORA-39070 一类错误。授权给执行导出的用户否则报权限不足。导出命令# 按用户导出4 个并行进程压缩元数据 expdp scott/tigerorcl \ directorydpdir \ dumpfilescott_%U.dmp \ logfilescott_exp.log \ schemasscott \ parallel4 \ compressionmetadata_onlydumpfilescott_%U.dmp里的%U是并行导出时的文件编号占位符parallel4 会生成 4 个文件不写 %U 会报错。compressionmetadata_only只压缩元数据对数据不压缩要压数据用compressionall但会吃 CPU。parallel不是越大越好一般不超过 CPU 核数超过反而因争抢资源变慢。导入命令# 导入并重映射到新用户和新表空间 impdp system/managertargetdb \ directorydpdir \ dumpfilescott_%U.dmp \ logfilescott_impdp.log \ remap_schemascott:scott_new \ remap_tablespaceusers:new_ts \ table_exists_actionreplaceremap_schema和remap_tablespace是数据泵的杀手锏跨用户、跨表空间迁移不用改 dmp。table_exists_action有 skip、append、truncate、replace 四个值replace 会先删表再建生产环境用之前务必确认。提示数据泵的 dumpfile 写在服务器上不是客户端。如果你在本地执行 expdp 却找不到文件先确认 directory 指向的服务器路径而不是你本机路径。3. 按场景选参数全库、按用户、按表、按条件导出怎么做工具选好了接下来是参数怎么配。不同迁移场景参数差别很大配错轻则慢重则数据缺失。这一章按四种常见场景给出可抄的命令和参数解释。3.1 全库导出与跨库迁移的完整流程全库导出用fully但生产库全库导出往往几百 G必须配并行和文件拆分。# 全库导出8 并行每文件上限 2G压缩数据 expdp system/managerorcl \ directorydpdir \ dumpfilefull_%U.dmp \ logfilefull_exp.log \ fully \ parallel8 \ filesize2G \ compressionall \ flashback_timesystimestampfilesize2G控制单个文件大小方便传输和分盘存放flashback_timesystimestamp用闪回时间点保证导出数据一致性比consistenty更现代但需要 UNDO 空间足够。全库导入时注意目标库最好空库否则对象冲突处理很麻烦。跨库迁移的完整流程我一般这么走源库 expdp 全库 → 传输 dmp 文件到目标服务器 → 目标库建 directory → impdp 导入 → 编译无效对象 → 收集统计信息。编译无效对象用?/rdbms/admin/utlrp.sql统计信息用 DBMS_STATS这两步不做导入后查询计划可能全乱。3.2 按用户和按表导出的参数差异按用户导出用schemas按表导出用tables。两者参数差异主要在过滤和依赖处理上。# 按用户导出排除某张大日志表 expdp scott/tigerorcl \ directorydpdir \ dumpfilescott_no_log.dmp \ logfilescott_no_log.log \ schemasscott \ excludetable:like LOG_% \ excludestatisticsexclude可以排除表、索引、统计信息等。excludestatistics很实用导入后重新收集统计信息比带着旧统计信息更准。按表导出# 只导出指定的几张表 expdp scott/tigerorcl \ directorydpdir \ dumpfilethree_tables.dmp \ logfilethree_tables.log \ tablesemp,dept,bonus \ contentdata_onlycontent有三个值all结构数据、data_only只数据、metadata_only只结构。做数据补录时用 data_only做结构比对时用 metadata_only。注意按表导出不会自动带上依赖的序列、触发器需要单独处理。3.3 按查询条件导出与增量同步思路数据泵支持 QUERY 参数按条件导出这是做部分数据迁移的利器。# 只导出 2024 年之后的订单数据 expdp scott/tigerorcl \ directorydpdir \ dumpfileorders_2024.dmp \ logfileorders_2024.log \ tablesorders \ queryorders:where create_time to_date(2024-01-01,yyyy-mm-dd)QUERY 参数只对表模式生效且条件里不能有子查询引用其他表。做增量同步时常见做法是按时间字段分批导出配合 MERGE 或外部表加载。如果要做真正的实时同步数据泵不合适得上 OGG 或基于日志的同步工具但那是另一个话题。数据泵的定位始终是逻辑层面的批量搬运别拿它当同步软件用。注意QUERY 里的引号在 Linux shell 下容易被吃掉建议把整条命令写进参数文件parfile用parfilexxx.par调用避免转义地狱。4. 导入导出避坑5 个真实翻车现场与排查路径参数会配了不代表不出事。这一章记录我踩过的 5 个坑每条按现象、原因、解决写照着排查能省不少时间。4.1 字符集不一致导致中文乱码现象导入后中文全变问号或乱码英文正常。原因源库和目标库字符集不一致比如源库 ZHS16GBK目标库 AL32UTF8exp/imp 不会自动转换直接按字节搬。解决导出前用SELECT * FROM nls_database_parameters WHERE parameterNLS_CHARACTERSET;确认两边字符集。不一致时要么建一个字符集一致的目标库要么用数据泵配合remap不行——字符集转换得靠导出时指定NLS_LANG环境变量或者用 CSALTER 脚本改库字符集风险极高务必先备份。最稳的做法是目标库字符集设为源库的超集UTF8 是 GBK 超集导入后中文正常。4.2 ORA-39002 / ORA-39070 目录对象报错现象expdp 一执行就报 ORA-39002 invalid operation 和 ORA-39070 unable to open the log file。原因DIRECTORY 指向的物理路径不存在或 oracle 用户没有写权限。解决登录服务器ls -ld /data/dump确认目录存在chown oracle:oinstall /data/dump改属主chmod 755给权限。如果路径在 ASM 上DIRECTORY 要指向DATA/dump这种 ASM 路径写法不同。排查顺序永远是目录存在吗 → 权限对吗 → DIRECTORY 对象指向对吗。4.3 导入时表空间不足或表空间名不存在现象impdp 报 ORA-01658 unable to create INITIAL extent或 ORA-00959 tablespace does not exist。原因目标库没有源库对应的表空间名或表空间剩余空间不够。解决用remap_tablespace源表空间:目标表空间重映射或者提前在目标库建好同名表空间并加数据文件。加数据文件ALTER TABLESPACE users ADD DATAFILE /data/users02.dbf SIZE 10G AUTOEXTEND ON NEXT 1G MAXSIZE 30G;。导入前先估算 dmp 大小目标表空间至少留 1.5 倍余量。4.4 序列值不连续或触发器失效现象导入后新插入数据的 ID 从 1 开始和原库冲突或触发器没导过来。原因exp/imp 默认不导序列的当前值只导序列定义触发器属于依赖对象按表导出时不会自动带。解决导出时加triggersyexp 默认就是 y但按表导出要确认。序列当前值需要单独处理常见做法是导入后手工ALTER SEQUENCE seq_name RESTART START WITH 最大值1;或者导出前用脚本把序列值查出来导入后重设。数据泵的includesequence可以单独导序列但当前值同样要手工对齐。4.5 大表导入慢到怀疑人生现象一张几千万行的表导入花了几小时日志几乎不动。原因没开并行、没关归档、没调大 buffer或者目标库有大量索引和约束在导入时逐行维护。解决导入时用parallel开并行导入前把目标表的索引和约束禁用导入后再重建这招对大数据量提升最明显。数据泵导入加transformdisable_archive_logging:y可以减少归档写入需确认业务允许。另外DATA_OPTIONSDISABLE_APPEND_HINT在某些版本能避免直接路径插入的额外开销视版本而定。提示导入前先impdp ... sqlfilexxx.sql只生成 DDL 不执行检查一遍建表语句和表空间映射比导到一半报错再回滚省事得多。5. 进阶技巧用参数文件、校验和与自动化脚本把迁移做稳前面讲的都是单次操作真正在生产里做迁移靠的是可重复、可校验、可回滚的流程。这一章讲三个进阶技巧参数文件管理、导入后数据校验、以及一个可复用的自动化脚本框架。5.1 用 parfile 管理复杂参数命令行参数一多就容易写错尤其是 QUERY 里的引号。把参数写进 parfile命令只剩一行可读性和可维护性都上来了。# expdp 调用参数文件 expdp scott/tigerorcl parfile/backup/exp_scott.par# /backup/exp_scott.par 内容 directorydpdir dumpfilescott_%U.dmp logfilescott_exp.log schemasscott parallel4 compressionmetadata_only excludestatistics queryorders:where create_time to_date(2024-01-01,yyyy-mm-dd)逻辑说明parfile 里每行一个参数等号两边不要空格字符串值不加引号除非值里有空格。QUERY 这种带引号的参数在 parfile 里写反而更清晰不用和 shell 转义打架。参数文件可以纳入版本管理每次迁移改哪几个值一目了然。5.2 导入后怎么校验数据没丢导入完成不等于数据正确。我一般做三层校验行数比对、关键字段聚合比对、抽样明细比对。-- 源库和目标库分别执行比对行数和金额合计 SELECT orders AS tab, COUNT(*) AS cnt, SUM(amount) AS total FROM orders UNION ALL SELECT order_items, COUNT(*), SUM(price*qty) FROM order_items;行数和金额合计对不上说明有数据丢失或重复。行数对但金额不对可能是精度问题或部分行截断。抽样比对用 MINUS-- 在目标库执行找出源库有但目标库没有的行需先建 dblink 或导出源数据 SELECT id, amount FROM orders MINUS SELECT id, amount FROM orderssource_link;MINUS 返回空说明两边一致。没有 dblink 时可以把源库查询结果导出成 CSV用外部表加载后比对。校验这一步别省我见过行数对但某个字段全为 NULL 的情况就是导入时列映射错了。5.3 一个可复用的迁移脚本框架把导出、传输、导入、校验串成一个脚本每次迁移改配置就行。下面是个简化框架#!/bin/bash # Oracle 迁移脚本框架按需修改配置区 set -e # 配置区 SRCscott/tigerorcl DSTsystem/managertargetdb DIRdpdir DUMPmig_%U.dmp PARALLEL4 SCHEMASscott # echo [1/4] 导出... expdp $SRC directory$DIR dumpfile$DUMP logfilemig_exp.log \ schemas$SCHEMAS parallel$PARALLEL compressionmetadata_only echo [2/4] 传输 dmp 到目标服务器... # scp 或 rsync按实际路径改 # scp /data/dump/mig_*.dmp target:/data/dump/ echo [3/4] 导入... impdp $DST directory$DIR dumpfile$DUMP logfilemig_imp.log \ remap_schema$SCHEMAS:${SCHEMAS}_new table_exists_actionreplace echo [4/4] 编译无效对象... sqlplus -s $DST EOF ?/rdbms/admin/utlrp.sql EXIT EOF echo 迁移完成请手工执行数据校验 SQL逻辑说明set -e让脚本遇错即停避免导出失败还继续导入。配置区集中管理连接串、目录、并行度换环境只改这里。传输那步注释掉了因为 scp 路径因环境而异实际用时打开。编译无效对象用 utlrp.sql导入后必做。校验 SQL 没写进脚本因为校验逻辑因表而异留成手工步骤更灵活。参数说明table_exists_actionreplace在重复迁移时很有用但生产环境第一次迁移建议用 skip确认无误后再改 replace。parallel根据服务器 CPU 和 I/O 调整4 到 8 是常见区间。5.4 几个值得记住的边界数据泵不是万能的。它不支持跨字符集的自动转换要靠 NLS_LANG不支持从高版本导到低版本不支持直接导到 ASM 以外的裸设备。exp/imp 虽然老但在跨大版本、小数据量、临时备份场景下依然是最省事的选择。真正做持续同步数据泵只能做批量实时同步得靠日志挖掘类工具。把这些边界记清楚选型时就不会翻车。我自己现在的习惯是任何一次迁移先写 parfile再跑一次 sqlfile 预览 DDL然后才真正导入导入后必做行数和金额校验。这套流程救过我好几次尤其是那次 80G 表空间迁移预览 DDL 时发现表空间映射写错了改完才没出事。希望帮到你。本文还有配套的精品资源点击获取
