三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Linux 下 Oracle 数据导出导入全流程:expdp / impdp 实战

Linux 下 Oracle 数据导出导入全流程:expdp / impdp 实战

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

五、常见坑

  1. 字符集不一致:导入出现乱码,先核对 userenv('language') 两端是否一致。
  2. 目录不存在ORA-39087: directory name is invalid——directory 没建或没赋权给操作用户。
  3. 表空间不足:先 select * from dba_tablespaces 确认目标空间,必要时扩表空间或 remap_tablespace
  4. 老 exp 导出的 dmp 用 impdp 导入:版本不兼容,exp/imp 与 expdp/impdp 不能混用。

六、小结

  • 迁移首选 expdp/impdp 数据泵,能力强、报错少;
  • 逻辑目录(directory)是桥梁,create directory + grant 两步不能省;
  • remap_schema / remap_tablespace 解决线上线下用户、表空间不一致;
  • 真实账号密码务必脱敏,别进脚本、别上网。

参考资料

  • Oracle 官方 Data Pump 文档
  • CSDN 数据泵实战博文(链接略)
  • 个人运维笔记整理
← 返回列表