varkai

此心不动,随机而动。

Oracle 使用数据泵进行数据导出导入

2019.06.09 运维

前言

从 Oracle Database 10g 开始提供了新的导出导入工具-数据泵,expdp 和 impdp 分别对应导出和导入命令,我们先看看它的主要特性:

  • 支持并行处理导入、导出任务。
  • 支持暂停和重启动导入、导出任务。
  • 支持通过 Database Link 的方式导出或导入远端数据库中的对象。
  • 支持在导入时通过 Remap_schema、Remap_datafile、Remap_tablespace 几个参数实现导入过程中自动修改对象属主、 数据文件或数据所在表空间。
  • 导入/导出时提供了非常细粒度的对象控制。通过 Include、Exclude 两个参数,甚至可以详细制定是否包含或不包含某个对象。

下面是 expdp/impdp 和 exp/imp 的区别:

  • exp 和 imp 是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。
  • expdp 和 impdp 是服务端的工具程序,他们只能在 Oracle 服务端使用,不能在客户端使用。
  • imp 只适用于 exp 导出的文件,不适用于 expdp 导出文件,impdp 只适用于 expdp 导出的文件,而不适用于 exp 导出文件。
  • 对于 Oracle Database 10g 以上的服务器,使用 exp 通常不能导出0行数据的空表,而此时必须使用 expdp 导出。

创建导出导入目录

首先我们需要在数据库服务器上创建一个用来保存导出文件的目录,我这里设置为 oracle 用户目录下的 dmp 目录,绝对路径为 /home/oracle/dmp,使用 oracle 用户登入服务器并创建该目录:

$ mkdir ~/dmp

然后进入 sqlplus 环境:

$ sqlplus /nolog

使用 SYSDBA 连接到数据库

SQL> CONN /AS SYSDBA

创建数据库逻辑目录:

SQL> CREATE DIRECTORY DATA_DUMP_DIR AS '/home/oracle/dmp';

使用以下语句可以查询所有的逻辑目录:

SQL> SELECT * FROM DBA_DIRECTORIES;

给指定用户赋予在该目录的操作权限,比如我这里授权给 MIAERP 用户:

SQL> GRANT READ, WRITE ON DIRECTORY DATA_DUMP_DIR TO MIAERP;

expdp 导出

使用 oracle 用户执行以下命令,使用 expdp 导出数据,有大概以下几种不同的方式:

  1. 全量导出:
$ expdp system/passwd@orcl dumpfile=expdp.dmp directory=data_dump_dir full=y logfile=expdp.log;
  1. 导出指定用户,其中 schemas 指定需要导出的用户:
$ expdp system/passwd@orcl schemas=导出的用户名 dumpfile=expdp.dmp directory=data_dump_dir logfile=expdp.log;
  1. 导出指定表空间,其中 tablespace 指定需要导出的表空间,多个表空间使用逗号隔开:
$ expdp system/passwd@orcl tablespace=tbs1,tbs2 dumpfile=expdp.dmp directory=data_dump_dir logfile=expdp.log;
  1. 导出指定表,其中 tables 指定需要导出的表,多个表使用逗号隔开:
$ expdp system/passwd@orcl tables=table1,table2 dumpfile=expdp.dmp directory=data_dump_dir logfile=expdp.log;

impdp 导入

首先参照上面的 创建导出导入目录 章节,在需要导入数据的目标服务器上创建好相应的目录,然后将需要导入的 dmp 文件上传到该目录。

使用 oracle 用户执行以下命令,使用 impdp 导入数据,主要有以下几种方式:

  1. 全量导入:
$ impdp system/passwd@orcl dumpfile=impdp.dmp directory=data_dump_dir full=y logfile=impdp.log;
  1. 导入指定用户:

导入到指定用户又分为下面几种情况:

  • 导入的用户已经存在,并且导入用户名和导出的用户名不一致:
$ impdp system/passwd@orcl schemas=导出用户名 dumpfile=impdp.dmp directory=data_dump_dir remap_schema=导出用户名:导入用户名 exclude=user logfile=impdp.log;
  • 导入的用户不存在:

此时 user2 用户会自动建立,其权限和使用的表空间与 user1 用户相同,但此时 user2 无法登入,必须修改密码。

$ impdp system/passwd@orcl dumpfile=impdp.dmp directory=data_dump_dir remap_schema=导出用户名:导入用户名 logfile=impdp.log;
  • 导入的用户已经存在,并且导入用户名和导出的用户名一致:
$ impdp system/passwd@orcl dumpfile=impdp.dmp directory=data_dump_dir schemas=导入用户名 logfile=impdp.log;
  1. 导入指定表:
$ impdp system/passwd@orcl tables=导出用户名.table1,导出用户名.table2 dumpfile=impdp.dmp directory=data_dump_dir remap_schema=导出用户名:导入用户名 logfile=impdp.log;
  1. 导入指定表空间:
$ impdp system/passwd@orcl tablespaces=tbs1,tbs2 dumpfile=impdp.dmp directory=data_dump_dir logfile=impdp.log;