Linux 下 Oracle 数据导出导入全流程:expdp / impdp 实战
本文记录一次真实的「从 Linux 上的 Oracle 导出数据,再导入到另一台机器」的完整操作。涉及生产账号密码的地方一律用占位符(
<USER>/<PASS>/<SERVICE>)替代,请在实际操作时替换为你自己的凭据,切勿把真实密码写进脚本或发到网上。
一、背景与准备
典型场景:源库在 Linux 服务器上,需要把某个 schema 整体迁移到目标机。
先确认环境信息(以下均为示例占位):
- 源库用户:
<USER> - 源库密码:
<PASS> - 服务名(Service Name):
<SERVICE> - 源库主机:
10.32.18.67(内网)
登录源库服务器并切到 oracle 用户:
ssh user@10.32.18.67
su - oracle
进入 SQL*Plus 查看字符集(确保源/目标一致,避免乱码):
sqlplus / as sysdba
SQL> select userenv('language') from dual;
-- 示例返回:AMERICAN_AMERICA.ZHS16GBK
如果源库是 11g,
sqlplus / as sysdba会显示类似Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit。
二、两种方式对比:老的 exp/imp vs 数据泵 expdp/impdp
方式一:传统 exp/imp(不推荐)
# 退出 sqlplus,回到 Linux shell
exp <USER>/<PASS>@<SERVICE> owner=<USER> \file=/export/home/oracle/LDJXDB/LDJXDB20220707.dmp \log=/export/home/oracle/LDJXDB/LDJXDB20220707.log
传统 exp 只导出表结构和数据等基本信息,容易缺东西(如某些对象类型、权限),导入时容易报错。新手经常被「导出了但导入失败」坑到。
方式二:数据泵 expdp / impdp(推荐)
数据泵是 10g 之后官方的标准迁移工具,支持并行、断点、细粒度过滤,能力强得多。
三、expdp 导出实战
3.1 创建逻辑目录(Directory)
逻辑目录是 Oracle 里的「路径别名」——它不会在操作系统真的建文件夹,只是把数据库里的目录对象映射到服务器某个路径。务必用 system 等管理员账号创建:
SQL> create directory testdata1 as '/export/home/oracle/LDJXDB';
SQL> grant read, write on directory testdata1 to <USER>;
常用排查 SQL:
select * from dba_directories; -- 查看已配置的目录对象
select * from dba_tablespaces; -- 查看表空间(导入前确认目标空间足够)
3.2 执行导出
expdp <USER>/<PASS>@<SERVICE> \schemas=<USER> \directory=testdata1 \dumpfile=hbsldgx0707.dmp \logfile=hbsldgx0707.log
参数说明:
| 参数 | 含义 |
|---|---|
schemas |
要导出的用户(schema) |
directory |
第 3.1 步创建的逻辑目录别名 |
dumpfile |
导出的 dmp 文件名 |
logfile |
日志文件 |
parallel |
并行度(大库可加 parallel=4 提速) |
3.3 把 dmp 拷到目标机
scp /export/home/oracle/LDJXDB/hbsldgx0707.dmp target-host:/data/dmp/
四、impdp 导入实战
在目标库服务器上,同样先建好对应的 directory 并赋权(参考 3.1),然后:
impdp <USER>/<PASS>@<SERVICE> \schemas=<USER> \directory=testdata1 \dumpfile=hbsldgx0707.dmp \logfile=hbsldgx0707_imp.log
如果源库用户和目标库用户不同,用 remap_schema 映射:
impdp system/<PASS>@<SERVICE> \directory=testdata1 \dumpfile=hbsldgx0707.dmp \remap_schema=<SRC_USER>:<TGT_USER>
常用参数:
| 参数 | 含义 |
|---|---|
remap_schema |
源用户:目标用户(不同则必写) |
remap_tablespace |
源表空间:目标表空间(表空间名不同才写) |
table_exists_action |
replace / append / skip(目标已存在表时如何处理) |
exclude |
排除某些对象,如 exclude=STATISTICS |
五、常见坑
- 字符集不一致:导入出现乱码,先核对
userenv('language')两端是否一致。 - 目录不存在:
ORA-39087: directory name is invalid——directory 没建或没赋权给操作用户。 - 表空间不足:先
select * from dba_tablespaces确认目标空间,必要时扩表空间或remap_tablespace。 - 老 exp 导出的 dmp 用 impdp 导入:版本不兼容,exp/imp 与 expdp/impdp 不能混用。
六、小结
- 迁移首选 expdp/impdp 数据泵,能力强、报错少;
- 逻辑目录(directory)是桥梁,
create directory+grant两步不能省; remap_schema/remap_tablespace解决线上线下用户、表空间不一致;- 真实账号密码务必脱敏,别进脚本、别上网。
参考资料
- Oracle 官方 Data Pump 文档
- CSDN 数据泵实战博文(链接略)
- 个人运维笔记整理