简介:这份资源是Oracle 11g 64位版本的bin目录文件集合,面向使用PL/SQL Developer进行数据库导入导出的DBA与开发人员,重点提供imp.exe与exp.exe两个核心工具,解决数据迁移、备份恢复及测试环境搭建中的导入导出需求。压缩包共691个文件,约126.04MB,以372个dll动态库、118个exe可执行程序、56个bat批处理脚本为主,另含pm、flt、pl、lib等辅助文件,覆盖数据库管理所需的完整二进制工具集。目前已有4158人学习下载,说明其在同类资源中具备一定参考价值。通过该目录,读者可获得可直接调用的导入导出命令行工具,配合PL/SQL Developer图形界面完成表、模式或整库的迁移,同时也能了解bin目录下sqlplus、oradim等工具的组织方式,为日常维护与版本升级提供便利。
1. 从一次数据迁移翻车说起:这套 Oracle 11g 64 位 bin 目录到底能干什么
上周帮一个做企业信息化的朋友处理数据迁移,对方发来一个压缩包,里面是 Oracle 11g 64 位客户端下的bin目录,核心就两个文件:imp.exe和exp.exe。他原话是“PL/SQL 里点导入导出总报错,你帮我看看是不是这俩文件的事”。我打开一看,目录里还带着impdp.exe、expdp.exe、sqlplus.exe以及一堆ora*动态库,典型的 Oracle 客户端可执行文件集合。
这套东西解决的就是一个很具体的场景:你手上有 Oracle 11g 的数据库,需要做逻辑备份或者跨库搬数据,但服务器端不一定让你随便动,或者你只有客户端权限,想通过 PL/SQL Developer 这类工具走本地的exp/imp命令来完成导出导入。它适合两类人:一是做传统企业项目、还在维护 Oracle 11g 的 DBA 或后端开发;二是需要把老库数据倒出来做迁移、做测试库搭建的工程师。注意,这是 64 位版本,32 位系统或者 32 位 PL/SQL 客户端直接不认,后面会细说这个坑。
2. exp/imp 与 expdp/impdp 的选型逻辑:为什么老项目还在用这套
2.1 两种导出导入机制的本质区别
exp.exe和imp.exe属于 Oracle 的原始导出导入工具,走的是客户端路径,数据流从数据库经过客户端进程再写到文件。expdp和impdp是 10g 之后引入的数据泵,走服务器端路径,文件直接落在数据库服务器的目录对象里。这个区别决定了它们的适用边界。
老项目坚持用exp/imp,通常是因为几个现实约束:数据库版本是 11g 甚至更早,数据泵虽然支持但运维习惯没改过来;或者导出文件要落到本地开发机上,数据泵的DIRECTORY对象配置起来多一道手续;再或者 PL/SQL Developer 的导入导出界面底层调的就是exp/imp,你装了 64 位客户端它才能找到对应的可执行文件。
但exp/imp有硬伤:它不支持并行,大表导出慢;它不导出某些新特性对象;它的字符集处理在跨库时容易出乱码。所以选型逻辑很简单——数据量在几十 GB 以内、对象类型不复杂、需要本地文件落地,用exp/imp没问题;数据量上百 GB、有分区表或 LOB 大字段、追求速度,老老实实上数据泵。
2.2 64 位 bin 目录的组成与依赖关系
这个bin目录不是只有两个 exe 就能跑起来的。imp.exe和exp.exe在启动时会加载同目录下的oraociei11.dll、orannzsbb11.dll、oraons.dll等动态库,还会去读tnsnames.ora和sqlnet.ora来解析连接串。如果你只把两个 exe 拷出来放到别的目录,大概率报“无法定位程序输入点”或者“ORA-12560: TNS 协议适配器错误”。
常见做法是保留整个bin目录结构,同时确保%ORACLE_HOME%环境变量指向这个目录的上一级,PATH里把bin加进去。PL/SQL Developer 在调用导入导出时,会去ORACLE_HOME下的bin找imp.exe,所以你的 PL/SQL 位数必须和这个 bin 目录一致——64 位 PL/SQL 配 64 位客户端,32 位配 32 位,混搭必翻车。
2.3 环境变量配置与验证步骤
先确认目录结构,假设解压后路径是D:\oracle\product\11.2.0\client_1,那么bin就在它下面。配置系统环境变量:
# 设置 Oracle 客户端根目录 setx ORACLE_HOME "D:\oracle\product\11.2.0\client_1" /M # 把 bin 目录加入 PATH,注意放在其他 Oracle 路径之前 setx PATH "%ORACLE_HOME%\bin;%PATH%" /M # 设置网络服务名配置文件所在目录 setx TNS_ADMIN "%ORACLE_HOME%\network\admin" /M # 字符集,一般跟数据库保持一致,常见 ZHS16GBK 或 AL32UTF8 setx NLS_LANG "SIMPLIFIED CHINESE_CHINA.ZHS16GBK" /M这几条命令的含义:ORACLE_HOME是客户端根目录,imp.exe启动时会根据它定位依赖库;PATH里把bin放前面是为了避免系统里装了多个 Oracle 版本时调错 exe;TNS_ADMIN指向tnsnames.ora所在目录,没有这个文件你连连接串都解析不了;NLS_LANG决定客户端字符集,设错了导出文件里的中文就是乱码。
配置完打开新的 cmd 窗口,执行imp help=y,如果能看到帮助信息输出,说明 exe 和依赖库加载正常。再执行tnsping 你的服务名,能通就说明网络配置没问题。这两步过了,才算环境就绪。
3. 用 exp.exe 做导出:参数拆解与三种典型场景
3.1 全库导出与用户级导出的命令差异
全库导出需要 DBA 权限,命令如下:
# 全库导出,文件写到 D:\backup\full.dmp exp userid="system/manager@orcl as sysdba" \ file=D:\backup\full.dmp \ log=D:\backup\full.log \ full=y \ buffer=10485760 \ consistent=y参数说明:userid里as sysdba表示以管理员身份连接,普通用户不需要;full=y表示导出整个数据库;buffer是数据缓冲区大小,默认值偏小,大表导出时调到 10MB 能减少 I/O 次数;consistent=y保证导出期间数据一致性,但需要回滚段空间,如果库上回滚段紧张就设n。
用户级导出更常用,把full=y换成owner=用户名:
# 导出指定用户的所有对象 exp userid="scott/tiger@orcl" \ file=D:\backup\scott.dmp \ log=D:\backup\scott.log \ owner=scott \ grants=y \ indexes=y \ rows=ygrants=y导出权限授权语句,indexes=y导出索引定义,rows=y导出表数据。如果只想导结构不导数据,把rows设成n。
3.2 按表导出与查询条件导出的写法
只导几张关键表:
# 导出 scott 用户下的 emp 和 dept 两张表 exp userid="scott/tiger@orcl" \ file=D:\backup\tables.dmp \ log=D:\backup\tables.log \ tables=(emp,dept) \ compress=ntables参数接受逗号分隔的表名列表,表名区分大小写,如果建表时用了引号括起来的小写名,这里也要对应写。compress=n表示不合并初始区,老版本默认y会把所有数据塞进一个初始 extent,导入时反而浪费空间,建议显式设n。
带查询条件的导出,只导 2023 年之后的数据:
# 按条件导出 emp 表的部分数据 exp userid="scott/tiger@orcl" \ file=D:\backup\emp_2023.dmp \ log=D:\backup\emp_2023.log \ tables=(emp) \ query="where hiredate > to_date('2023-01-01','yyyy-mm-dd')"query参数里的条件会拼到select * from emp后面,所以写法要符合 SQL 语法。注意引号转义,Windows cmd 下用双引号包住整个参数,里面字符串用单引号。
3.3 导出日志的解读与常见警告
导出完成后先看 log 文件末尾,正常结束会显示“成功终止导出, 没有出现警告”。如果出现“EXP-00008: 遇到 ORACLE 错误 942”,说明有对象不存在,通常是权限不够或者对象已被删除,不影响其他对象导出。如果出现“EXP-00091: 正在导出有问题的统计信息”,是统计信息表访问权限问题,可以忽略,或者用statistics=none跳过统计信息导出。
真正要警惕的是“EXP-00056: 遇到 ORACLE 错误 12154”和“ORA-12154: TNS: 无法解析指定的连接标识符”,这是连接串配错了,检查tnsnames.ora里的服务名和TNS_ADMIN路径。还有“ORA-01555: 快照过旧”,说明回滚段不够,要么加大回滚段,要么把consistent设成n重新导。
4. 用 imp.exe 做导入:顺序、参数与冲突处理
4.1 导入前的对象检查与表空间规划
导入不是把 dmp 文件一扔就完事。先确认目标库有没有对应的表空间,如果源库的表建在USERS表空间,目标库没有这个表空间,导入时会报“ORA-00959: 表空间不存在”。解决办法要么提前建好同名表空间,要么用imp的fromuser和touser参数做用户映射,但表空间映射imp不支持,只能改 dmp 里的表空间定义或者提前建好。
检查目标库字符集:select * from nls_database_parameters where parameter='NLS_CHARACTERSET';,如果和导出时的NLS_LANG不一致,中文数据可能变问号。常见做法是导出前确认源库字符集,导入时把NLS_LANG设成和目标库一致。
4.2 全量导入与增量导入的参数配置
全量导入一个用户:
# 把 scott.dmp 导入到目标库的 scott 用户下 imp userid="scott/tiger@target" \ file=D:\backup\scott.dmp \ log=D:\backup\imp_scott.log \ fromuser=scott \ touser=scott \ commit=y \ buffer=10485760 \ ignore=yfromuser和touser指定源用户和目标用户,如果同名可以只写touser。commit=y表示每插入一批就提交,避免大事务把回滚段撑爆;ignore=y表示忽略建表时的“对象已存在”错误,适合往已有表里追加数据。如果目标表是空的、想完全重建,把ignore设成n,但这样遇到已存在的表会报错终止。
只导入特定表:
# 只导入 emp 和 dept 两张表 imp userid="scott/tiger@target" \ file=D:\backup\tables.dmp \ log=D:\backup\imp_tables.log \ tables=(emp,dept) \ ignore=y \ commit=ytables参数和导出时对应,只导入列表里的表,其他对象跳过。
4.3 导入过程中的报错分类与应对
导入 log 里最常见的几类错误:ORA-00955: 名称已由现有对象使用,这是表或索引已存在,如果确认要覆盖就加ignore=y,如果不想覆盖就手动删掉目标对象再导。ORA-00001: 违反唯一约束条件,说明表里有重复数据,要么清空目标表再导,要么检查 dmp 里是不是包含了重复记录。ORA-01653: 表无法通过 128 扩展,表空间满了,加数据文件或者开自动扩展。
还有一种情况是导入到一半卡住不动,log 也不更新。先查目标库有没有锁:select * from v$locked_object;,有锁就找阻塞会话处理。再查回滚段使用率,commit=y没设的话大事务会把回滚段占满,导致其他会话挂起。
5. 避坑与排查:PL/SQL 调用 imp/exp 的五个血泪教训
5.1 现象:PL/SQL 点导出没反应,命令行却能跑
原因:PL/SQL Developer 是 32 位程序,但bin目录是 64 位的,它调用imp.exe时系统报“不是有效的 Win32 应用程序”,但 PL/SQL 把这个错误吞了,界面上只显示“正在导出”然后一直转圈。
解决:确认 PL/SQL 的位数,在“帮助-关于”里看。32 位 PL/SQL 必须配 32 位 Oracle 客户端,64 位配 64 位。如果手头只有 64 位 bin 目录,要么换 64 位 PL/SQL,要么用命令行手动执行 exp/imp。
5.2 现象:导出文件只有几 KB,log 显示“成功终止”
原因:exp命令里tables或owner参数写错了,比如表名大小写不对、用户不存在,Oracle 不报错,直接导出一个空文件。
解决:导出前先用sqlplus连上去select table_name from user_tables;确认对象存在。导出后检查 dmp 文件大小,正常应该和表数据量匹配。log 里搜“导出表”的行数,如果是 0 就要警惕。
5.3 现象:导入后中文全是问号
原因:NLS_LANG设置和 dmp 文件里的字符集不匹配。比如导出时是AL32UTF8,导入时设成了ZHS16GBK,Oracle 会做字符集转换,转不过去的字符就变问号。
解决:导出前记录源库字符集,导入时把NLS_LANG设成和源库一致。如果目标库字符集不同,导入后再用convert函数或者重新导出成目标库字符集。
5.4 现象:ORA-12560 TNS 协议适配器错误
原因:TNS_ADMIN没设,或者tnsnames.ora里没有对应的服务名,或者PATH里有多个 Oracle 版本的bin,调到了错误的imp.exe。
解决:echo %TNS_ADMIN%确认路径,type %TNS_ADMIN%\tnsnames.ora确认服务名存在。where imp看系统实际调用的是哪个 exe,如果指向了别的 Oracle 目录,调整PATH顺序。
5.5 现象:导入大表时 ORA-01555 快照过旧
原因:imp导入时如果开了commit=n,整个导入是一个大事务,回滚段要保存所有前镜像,回滚段不够就报快照过旧。
解决:导入时加commit=y,让 Oracle 分批提交。如果已经报了,加大回滚段或者延长undo_retention,然后重新导入。
6. 进阶技巧:用参数文件批量执行与导入后校验
命令行敲一长串参数容易出错,尤其是表多的时候。我一般会把参数写进一个.par文件,然后imp userid=... parfile=xxx.par调用。比如导出一个用户下所有表但排除几张日志表:
# exp_scott.par 参数文件内容 userid=scott/tiger@orcl file=D:\backup\scott_exclude.dmp log=D:\backup\scott_exclude.log owner=scott # 排除 log_ 开头的表 exclude=table:"like 'LOG_%'" buffer=10485760 consistent=yexclude参数支持通配符,table:"like 'LOG_%'"表示排除所有以 LOG_ 开头的表。注意引号嵌套,par 文件里用双引号包住整个条件,里面字符串用单引号。执行时exp parfile=D:\backup\exp_scott.par即可。
导入完成后别急着交差,做两步校验。第一步比对行数,在源库和目标库分别执行:
-- 源库查行数 select table_name, num_rows from user_tables order by table_name; -- 目标库查行数,两边结果贴到 Excel 里做差 select table_name, num_rows from user_tables order by table_name;num_rows是统计信息里的值,可能不准,精确比对用select count(*) from 表名;,表多的话写个游标批量跑。第二步检查无效对象:
-- 查目标库里的无效对象 select object_name, object_type, status from user_objects where status = 'INVALID';如果有无效的存储过程或触发器,用alter procedure 名称 compile;重新编译。索引失效的话alter index 索引名 rebuild;。
从那以后我每次拿到一个新的 Oracle 客户端 bin 目录,都强制走一遍“位数确认 → 环境变量配置 → tnsping 连通 → 小表试导 → 全量执行”的流程,不再直接上生产库操作。这套习惯帮我省掉了至少三次半夜回滚的麻烦。希望帮到你。
本文还有配套的精品资源,点击获取