简介:面向使用 Oracle 11g 64 位数据库的 DBA、开发与运维人员,这份资源提供完整的 bin 目录,重点包含用于数据导入导出的 imp.exe 与 exp.exe,可直接配合 PL/SQL Developer 的图形化界面调用,解决数据迁移、备份恢复与测试环境搭建中的实际需求。压缩包共 691 个文件,约 126.04MB,以 372 个 dll 动态库、118 个 exe 可执行程序、56 个 bat 批处理脚本为主,另含 pm、flt、pl、lib 等辅助文件,基本还原了 Oracle 核心工具集的目录结构。已有 4162 人学习下载,说明其在同类资源中具备一定参考价值。读者可据此补齐缺失的导入导出组件,理解 exp/imp 在表、模式、用户及整库级别迁移中的用法,并借助 sqlplus、oradim 等配套工具完成实例启停与配置管理,适合需要快速恢复命令行工具链或排查环境缺失问题的中高级用户。
1. Oracle 11g 64 位环境里,bin 目录到底该放什么
上周帮一位同事收拾一台老数据库客户端,PL/SQL Developer 里点导出,弹窗一闪而过,日志里只有一行“无法启动 EXP”。翻到安装目录一看,bin 下只有半套文件,imp.exe 在,exp.exe 没了,旁边还混着 32 位的 DLL。这种场面在 Oracle 11g 64 位环境里太常见了:客户端装了一半、补丁打了一半、有人手动从别的机器拷过文件,最后导入导出这条链路就断在 bin 目录上。这篇笔记就围绕 Oracle 11g 64 位下 bin 目录里的 imp.exe 和 exp.exe 展开,把版本怎么对、文件怎么放、环境变量怎么配、PL/SQL 里怎么调通、坏了怎么救,一步步走完。适合正在配 Oracle 客户端、需要做数据库导入导出的开发者,新手能照着装,熟手能对照看版本和参数取舍。
2. 装前把版本和环境对齐:64 位客户端与 imp/exp 的匹配关系
2.1 先确认你要的是客户端还是完整服务端
很多人一上来就找 Oracle 11g 安装包,其实做导入导出不一定需要装完整数据库。imp.exe 和 exp.exe 属于 Oracle 客户端工具集,只要客户端版本和数据库服务端版本对得上,本机不装数据库实例也能跑。常见做法是装 Oracle Database Client 11.2 的 64 位版本,安装时选“管理员”或“运行时”类型,bin 目录里就会带上 exp.exe、imp.exe、sqlplus.exe 这一套。
需要先分清三种情况:
| 场景 | 本机需要装什么 | bin 目录来源 |
|---|---|---|
| 只做导入导出 | Oracle 11g 64 位客户端 | 客户端安装目录下的 bin |
| 本机有数据库实例 | Oracle 11g 64 位服务端 | ORACLE_HOME\bin |
| 从别的机器拷文件 | 不建议,仅应急 | 必须同版本同位数 |
第三种是翻车高发区。imp.exe 和 exp.exe 不是绿色程序,它们依赖同目录下的 OCI 相关 DLL(oraociei11.dll、oraclient11.dll 等),还依赖注册表里的 ORACLE_HOME 指向。单独拷两个 exe 过去,运行时大概率报“找不到 OCI.dll”或者直接闪退。
2.2 位数必须一致,这是硬约束
Oracle 11g 的 64 位客户端只能配 64 位的 imp/exp,32 位客户端只能配 32 位的。混用的典型症状是:命令行里 exp 能跑,PL/SQL Developer 里点导出就失败,因为 PL/SQL 本身有 32 位和 64 位两个版本,它调用的 exp.exe 位数必须和自己一致。
我一般按这个顺序核对:
# 1. 看 exp.exe 的位数(Windows 下用 PowerShell) Get-Item "C:\oracle\product\11.2.0\client_1\bin\exp.exe" | Select-Object Name, Length # 2. 更直接的办法:看文件属性里的“产品版本”,64 位会标 x64 # 3. 命令行验证 exp 能否启动 exp help=yexp help=y是最省事的探针。能打印出参数帮助,说明 exe 本身和依赖 DLL 都加载正常;如果报错或闪退,问题就在依赖链上,不在参数上。这一步别跳过,后面所有配置都建立在“exp 能独立启动”这个前提上。
2.3 ORACLE_HOME 和 PATH 的写法
客户端装完后,环境变量要指对。常见做法是设两个:
# 系统环境变量(以客户端装在 C:\oracle\product\11.2.0\client_1 为例) ORACLE_HOME=C:\oracle\product\11.2.0\client_1 PATH=%ORACLE_HOME%\bin;%PATH%ORACLE_HOME是 imp/exp 找依赖文件的根,PATH里加 bin 是为了命令行直接敲 exp 就能命中。注意 PATH 里如果同时存在另一个 Oracle 的 bin(比如以前装过 10g 或 32 位客户端),顺序决定命中哪个,老版本在前就会调到错的 exp。装完后开一个新的命令行窗口验证,别在旧窗口里试,旧窗口的 PATH 是启动时快照的。
提示:改完环境变量一定要新开终端。我见过不止一次“配了没生效”,其实是窗口没换。
3. 把 imp.exe 和 exp.exe 放进 bin:文件落位与依赖检查
3.1 bin 目录里到底该有哪些文件
Oracle 11g 64 位客户端装好后,bin 下和导入导出直接相关的文件大致是这些:
| 文件 | 作用 | 缺失后果 |
|---|---|---|
| exp.exe | 导出工具 | 无法导出 |
| imp.exe | 导入工具 | 无法导入 |
| sqlplus.exe | 命令行连接 | 无法手工验证连接 |
| oraclient11.dll | 客户端核心库 | exp/imp 启动失败 |
| oraociei11.dll | OCI 即时客户端库 | 报 OCI 相关错误 |
| orannzsbb11.dll | 网络加密相关 | 连接时报协议错误 |
判断文件是否齐全,不用一个个对,直接跑exp help=y和imp help=y,两个都能出帮助就说明核心链路是通的。如果 exp 能跑、imp 报错,那多半是 imp.exe 被单独替换过,版本和同目录 DLL 不匹配。
3.2 从安装包补文件,不要从别处拷
如果发现 bin 里缺 exp.exe 或 imp.exe,正确做法是重新运行客户端安装程序,选“修复”或者补装组件,而不是从另一台机器拷。原因前面说过:exe 和 DLL 是成套的,跨机器拷容易版本错位。真到了只能拷的应急场景,至少保证源机器和目标机器的客户端版本号完全一致(比如都是 11.2.0.4),位数一致,然后把整个 bin 目录一起拷,不要只拷两个 exe。
补完文件后做一次依赖检查:
# 切到 bin 目录,逐个确认关键 DLL 存在 cd /d C:\oracle\product\11.2.0\client_1\bin dir oraclient11.dll oraociei11.dll orannzsbb11.dll # 再跑一次帮助,确认 exp/imp 都能启动 exp help=y imp help=ydir那步是确认依赖文件在不在,help=y那步是确认加载链通不通。两步都过,bin 这一层就算配好了,可以往连接和 PL/SQL 调用走。
3.3 网络配置文件别漏
imp/exp 连数据库靠的是 ORACLE_HOME 下的 network\admin 目录,里面至少要有 tnsnames.ora(配了服务名)或者直接用 EZConnect 写法。如果只配了 bin 没配网络,exp 能启动但连不上库,报 ORA-12154 或 ORA-12541。
# tnsnames.ora 示例(路径:%ORACLE_HOME%\network\admin\tnsnames.ora) MYDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )HOST填数据库服务器地址,PORT默认 1521,SERVICE_NAME填服务端实际的服务名,不确定就问 DBA 或者用lsnrctl status在服务端看。配完用tnsping MYDB验证,能返回“OK”说明网络层通了。这一步和 bin 目录是两件事,但导入导出跑不通时,一半的问题出在这里。
4. 在 PL/SQL Developer 里调通导入导出:工具配置与参数取舍
4.1 让 PL/SQL 找到正确的 exp/imp
PL/SQL Developer 的导入导出功能本质上是调外部的 exp.exe 和 imp.exe,所以它必须知道这两个文件在哪。配置入口在 Tools → Preferences → Tools,里面有一项“Oracle Home”或者直接指定 exp/imp 路径。64 位 PL/SQL 要配 64 位的 exp/imp,32 位配 32 位,这条前面强调过,这里再落一次地。
配置时注意两点:一是路径里不要有中文和空格,二是配完后重启 PL/SQL,它启动时才读这个配置。配错了的典型表现是点导出后弹一个空白的命令行窗口然后消失,或者提示“Cannot find EXP.EXE”。
4.2 导出参数怎么选
PL/SQL 的导出界面背后拼的是 exp 命令,理解几个关键参数比记界面按钮有用:
# 典型导出命令(全库某用户) exp userid=scott/tiger@MYDB owner=scott file=D:\backup\scott.dmp log=D:\backup\scott_exp.log # 按表导出 exp userid=scott/tiger@MYDB tables=(emp,dept) file=D:\backup\tables.dmp log=D:\backup\tables_exp.log # 只导结构不导数据 exp userid=scott/tiger@MYDB owner=scott rows=n file=D:\backup\scott_struct.dmpuserid是账号/密码@服务名,owner指定按用户导出,tables指定按表导出,file是 dmp 落盘路径,log是日志路径,rows=n表示只导结构。这几个参数覆盖了日常八成场景。PL/SQL 界面上勾选“包含行”对应 rows 的取值,勾“压缩”对应 compress 参数,导出大表时 compress=y 会让 dmp 里预留连续空间,导入时更顺,但 dmp 文件会偏大,按磁盘余量取舍。
4.3 导入参数与常见顺序问题
导入侧最容易被忽略的是“先建用户还是先导入”。imp 不会自动建用户,目标用户必须提前存在且有配额:
# 目标端先建用户(用 sqlplus 执行) sqlplus / as sysdba CREATE USER scott IDENTIFIED BY tiger DEFAULT TABLESPACE users QUOTA UNLIMITED ON users; GRANT CONNECT, RESOURCE TO scott; # 再执行导入 imp userid=scott/tiger@MYDB file=D:\backup\scott.dmp log=D:\backup\scott_imp.log full=y ignore=yfull=y表示导入 dmp 里的全部内容,ignore=y表示遇到已存在的对象跳过而不是报错中断。ignore=y在重复导入时很有用,但第一次导入建议先不加,让错误暴露出来,确认没问题后再加。导入顺序上,先导结构再导数据、先导主表再导从表(有外键时),这些 imp 本身不保证,需要按业务依赖手工排。
注意:imp 是客户端工具,导入过程在客户端和服务端之间传数据,大 dmp 导入时客户端机器不能断网、不能休眠。
5. 导入导出翻车现场:五类高频问题排查
5.1 现象:exp 一闪而过,没有任何输出
原因:exe 依赖的 DLL 缺失或位数不匹配,进程启动即退出。解决:在命令行直接跑exp help=y,看是否报具体 DLL 名;用文件属性确认 exp.exe 是 64 位;检查 PATH 里是否有另一个 Oracle 的 bin 排在前面。确认后重装或修复客户端,别手工拷文件。
5.2 现象:报 ORA-12154 无法解析服务名
原因:tnsnames.ora 没配、配错路径,或者 exp 读的不是你以为的那个 ORACLE_HOME。解决:tnsping 服务名先验证;确认%ORACLE_HOME%\network\admin\tnsnames.ora存在且服务名拼写一致;如果机器上有多个 Oracle Home,检查环境变量指向哪个。应急可以用 EZConnect 写法userid=scott/tiger@192.168.1.10:1521/orcl绕过 tnsnames。
5.3 现象:PL/SQL 里导出失败,命令行却正常
原因:PL/SQL 调用的 exp 路径和命令行 PATH 里的不是同一个,或者位数不匹配。解决:在 PL/SQL 的 Tools 配置里显式指定 exp.exe 完整路径;确认 PL/SQL 本身位数和 exp 一致;配完重启 PL/SQL。这条是最典型的“命令行能跑、界面不行”。
5.4 现象:导入报 ORA-01950 表空间无权限
原因:目标用户没有配额,或者 dmp 里的表空间在目标端不存在。解决:给用户加QUOTA UNLIMITED ON 表空间;如果 dmp 来自别的库、表空间名不同,导入前用imp ... indexfile=xxx.sql先导出建表语句,改好表空间名再导,或者导入时用fromuser/touser做用户映射。
5.5 现象:导入一半报 ORA-00001 唯一约束冲突
原因:目标表已有数据,重复导入。解决:确认是否该用ignore=y;如果是全量覆盖,先清目标表再导;如果是增量,检查 dmp 来源和导入范围是否重叠。别一上来就加 ignore=y 掩盖问题,先搞清楚冲突是预期内还是数据错位。
6. 装完怎么验证跑通:一条最小闭环与我的固定习惯
验证不用搞复杂,一条最小闭环就够:建一张小表、导出来、删掉、再导回去、查数据。整个过程十分钟内能走完,但能把 bin 目录、环境变量、网络配置、PL/SQL 调用四层全部串起来验一遍。
# 1. 源端建测试表并插数据(sqlplus) sqlplus scott/tiger@MYDB CREATE TABLE t_verify (id NUMBER, name VARCHAR2(50)); INSERT INTO t_verify VALUES (1, 'test'); COMMIT; # 2. 导出这张表 exp userid=scott/tiger@MYDB tables=(t_verify) file=D:\backup\t_verify.dmp log=D:\backup\t_verify_exp.log # 3. 删表 sqlplus scott/tiger@MYDB DROP TABLE t_verify; # 4. 导回 imp userid=scott/tiger@MYDB tables=(t_verify) file=D:\backup\t_verify.dmp log=D:\backup\t_verify_imp.log # 5. 查数据 sqlplus scott/tiger@MYDB SELECT * FROM t_verify;五步里任何一步失败,问题就锁定在那一层:第 2 步失败看 bin 和网络,第 4 步失败看用户权限和表空间,第 5 步查不到数据看导入日志里的行数统计。日志文件别删,t_verify_exp.log和t_verify_imp.log里记录了导出了多少行、导入了多少行、有没有警告,比界面上的“成功”提示可信得多。
再补一个习惯:验证时故意用 PL/SQL 界面走一遍同样的导出导入,因为命令行通不代表界面通,两者调 exp 的方式不同。命令行验证的是工具本身,界面验证的是配置路径,两条都过才算真跑通。
从那以后我每次配完 Oracle 客户端,不管多急,都强制走一遍这条最小闭环,尤其是换机器、换版本、换 PL/SQL 位数之后。血泪经验是:导入导出这种链路,看着简单,断点却分散在 bin、环境变量、网络、权限四个地方,不跑一遍闭环,等到真要用的时候才发现问题,代价就大了。希望帮到你。
本文还有配套的精品资源,点击获取