当前文档以Oracle 11G官方文档为参考。

应用场景

Oracle不建议使用此方法进行备份与还原操作,主要原因是性能太慢。

备份和还原的对象数据量较小。

exp和imp的简介

Oracle提供了一种在数据库与数据库之间传输对象的简单方法,即使它们是不同硬件和软件配置的操作系统上。
传输数据支持以下四种模式进行传输:

  • 数据库 导出完整的数据库
  • 表空间 导出一组表空间
  • 用户 导出属于用户的所有对象(例如表、授权、索引等)
  • 表 导出特定的表和分区

用这四种模式,我们可以根据特定场景去使用。
Oracle提供的方法原理主要是,exp(导出实用程序)通过查询SQL去获取数据(将数据从磁盘读取到Database Buffer Cache),然后将Database Buffer Cache再转入到某个缓冲区(Oracle称为evaluating buffer,即SQL处理层)中进行SQL处理,处理后的数据再写入到二进制的转储文件中。imp(导入实用程序)读取二进制的转储文件(数据从磁盘读取到Database Buffer Cache),然后经过SQL处理,处理后的数据导入到数据库中。
转储文件(dmp)既可以是在服务器端生成,也能在客户端生成。在服务器端执行生成转储文件(dmp)时,性能取决于硬盘的IO,而在客户端生成转储文件时,它不仅受到硬盘IO的影响,还要受到网络IO(网速)的影响。因此,条件允许的情况下,尽量在服务器中执行导出命令,然后再将转储文件(dmp)传输到另一台服务器端并导入,而不是直接使用客户端导出和导入。

exp和imp的三种方式

exp和imp,这两个都可以使用以下三种方式来操作数据

  • 命令行
  • 参数文件
  • 交互式

这三种方式,你可以任意选择自己喜欢的模式来进行操作。

命令行方式

命令行方式主要就是将所有的参数都写成一行,直接在命令行去执行。

参数文件方式

使用参数文件方式,我们需要先新建一个文件,将导出或导入相关的参数写在此文件中,然后在执行时,调用此文件。

交互式方式

使用交互式方式时,系统不断给出导出或导出需要的参数,我们则给出应答。在生产环境中,我个人感觉不会使用到此方式,多数都会提前写出参数文件或者使用命令行来执行导数操作。

exp和imp的常用参数

备注:这里的语句只列出常用的,如果有未列出的,而你又会经常使用的,可以私聊我哦!!!

exp的常用参数

BUFFER

特别提示: BUFFER参数仅对常规路径的导出有影响

指定用于获取行的缓冲区的大小(以字节为单位)。默认值跟操作系统有关。

DIRECT

指定导出通过直接读取数据来提取数据,绕过SQL命令处理层(评估缓冲区)。

FILE

指定导出转储文件的名称,默认值是EXPDAT.DMP。转储文件如果是多个,可以用英文的逗号来分开。

FILESIZE

指定导出转储文件的最大文件大小,通常用于指定导出多个转储文件的情况下。

OWNER

指定导出是用户模式。如果使用的用户是DBA,则可以导出多个用户。

PARFILE

指定使用的参数文件,只有使用参数文件方式导出时才会使用。

RECORDLENGTH

特别提示: 此参数值最大只能设置到64KB。

指定导出数据达到多大时写入到磁盘(以字节为单位),需要和DIRECT参数一起使用。

TABLES

特别提示: 导出表的特定分区,格式为:schemaname.tablename:partition_name,例如:a.test:b,表示a用户下test表的b分区。

指定导出是表模式。如果是使用DBA导出不同用户的表,则需要增加用户名,多个表用逗号分隔。

TABLESPACES

指定将表空间中所有表导出到转储文件。无论索引存储在何处,都会与表一起导出。

imp的常用参数

BUFFER

指定导入传输行的缓冲区大小(以字节为单位)。

COMMIT

指定在每次插入数组后是否提交,默认值N,表示仅在加载完每个表后提交。

DATA_ONLY

指定仅导入转储文件的数据,不导入元数据。默认值N,表示正常导入所有数据和元数据。

FILE

指定导入的转储文件的名称,默认值EXPDAT.DMP。转储文件如果是多个,可以用英文的逗号来分开。

FILESIZE

指定最大转储文件大小,必须跟导出时指定的参数值一样。

FROMUSER

指定要导入的用户名,多个以逗号分隔。

LOG

指定导入日志的文件名,不指定只会在终端运行时显示。

PARFILE

指定导入参数使用的参数文件。

RECORDLENGTH

指定导入数据达到多大时写入到磁盘(以字节为单位)。默认值跟操作系统有关。如果导出文件有使用,则导入文件可以使用此参数来指定导入I/O缓冲区的大小。

TABLES

特别提示: 导出表的特定分区,格式为:schemaname.tablename:partition_name,例如:a.test:b,表示a用户下test表的b分区。

指定导入是表模式。如果是使用DBA导出不同用户的表,则需要增加用户名,多个表用逗号分隔。

TABLESPACES

指定将转储文件中的表空间传输到数据库的表空间。如果导出文件有多个,则必须将所有表空间都导入数据库。

TOUSER

指定将转储文件中的用户导入到数据库中的用户。

exp和imp的使用

备注:以下示例全部采用命令行方式。

完整数据库的导出和导出

此示例仅供参考,不建议使用于真实生产环境、测试环境和开发环境等。

导出示例

exp system/orcl@192.168.3.24/orcl file=C:\Users\buxb\Desktop\temp\data.dmp log=C:\Users\buxb\Desktop\temp\data.log full=y
image.png

导入示例

这里导入会报一堆错,就不截图了,错误多数是表已存在,视图已存在等错误。

imp system/orcl@192.168.3.24/orcl file=C:\Users\buxb\Desktop\temp\data.dmp log=C:\Users\buxb\Desktop\temp\data.log full=y

表空间的导出和导入

特别提示:目标数据库必须要先创建同名的表空间才行。

导出示例

exp system/orcl@192.168.3.24/orcl file=C:\Users\buxb\Desktop\temp\data.dmp log=C:\Users\buxb\Desktop\temp\data.log tablespaces=TEST_DATA
image.png

导入示例

imp system/orcl@192.168.3.24/orcl file=C:\Users\buxb\Desktop\temp\data.dmp log=C:\Users\buxb\Desktop\temp\data.log full=y
image.png

用户的导出和导入

以下示例是在windows客户端中,导出192.168.3.24服务器中orcl实例下的HR用户下的所有对象,然后又将其导入到TEST用户中(中间涉及到的删用户和删除表空间操作就不做展示)。

导出示例

exp system/orcl@192.168.3.24/orcl file=C:\Users\buxb\Desktop\temp\data.dmp log=C:\Users\buxb\Desktop\temp\data.log owner=test
image.png

导入示例

image.png

表的导出和导入

以下示例是在windows客户端中,导出192.168.3.24服务器中orcl实例下的HR用户中的departments,employees这两个表,然后又将其导入到HR用户中(中间涉及到的删表操作就不做展示)。

导出示例

exp hr/hr@192.168.3.24/orcl file=C:\Users\buxb\Desktop\temp\data.dmp log=C:\Users\buxb\Desktop\temp\data.log tables=departments,employees
image.png

导入示例

imp hr/hr@192.168.3.24/orcl file=C:\Users\buxb\Desktop\temp\data.dmp log=C:\Users\buxb\Desktop\temp\data.log tables=departments_bak,employees_bak
image.png