介绍

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

简单理解起来,就是Oracle提供了一个工具,用来将源数据库中的对象备份并还原到目标数据库。

这种工具支持以下四种模式进行传输:

  • 数据库模式
  • 表空间模式
  • 用户模式
  • 表模式

这四种模式会使用后,我们就可以在任何场景随意发挥。

原理

exp和imp原理是exp(导出实用程序)通过查询SQL去获取数据(将数据从磁盘读取到Database Buffer Cache),然后将Database Buffer Cache再转入到某个缓冲区(Oracle称为evaluating buffer,即SQL处理层)中进行SQL处理,处理后的数据再写入到二进制的转储文件中。imp(导入实用程序)读取二进制的转储文件(数据从磁盘读取到Database Buffer Cache),然后经过SQL处理,处理后的数据导入到数据库中。

使用场景

exp和imp既可以用于服务端中,又能够在客户端使用。

需要注意,在客户端使用时,网速也可能会导致备份或还原的速度。因此,条件允许的情况下,尽量在服务端执行导入导出。

使用方式

exp和imp可以使用以下三种方式来执行

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

这三种方式都可以导入和导出,所以使用哪种就看自己的个人喜好,我个人喜好命令行方式。

使用限制

exp和imp工具建议使用在小型数据库的情况下。

按我的理解,数据库总大小在30G以内,使用这种工具进行数据的备份和还原,性能上还不会非常慢,一旦超过30G后,就会发现性能非常慢。

常用参数

需要说明,这里列出的只是我认为常用的参数。如果没找到参数,不代表没有,只能说明是我少写了。

通用参数

BUFFER

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

FILE

FILE参数指定转储文件(DMP文件)导出或导入的文件名称,默认值是EXPDAT.DMP。如果有多个DMP文件,使用英文逗号隔开。

PARFILE

PARFILE参数指定导出或导入使用的参数文件,使用参数文件方式执行使用。

RECORDLENGTH

RECORDLENGTH参数指定导出或导入的数据达到多大值时写入到磁盘中(以字节为单位),最大值64KB,也就是65536。

如果导出时有使用DIRECT参数(直接路径加载),导入就能够指定RECORDLENGTH参数的值。

TABLES

指定导出或导入是表模式。如果导出或导入的是自己拥有的表,则用户名可选择加或不加。如果导出的是其他用户下的表,则表名必须要加上表名的用户名(表拥有者)。

TABLESPACES

指定导出或导入是表空间模式。指定此参数会将表空间中的所有表和索引都会导出或导入,无论索引是否在该表空间中。

ROWS

指定导出或导入时是否插入表中的数据,参数可选择[Y/N]。Y表示导入或导出表中的数据,N表示不导入或导出表中的数据。

exp私有参数

DIRECT

DIRECT参数指定以直接路径导出,导出就不再经过SQL命令处理层(评估缓冲区),导出的速度会比不指定有明显的提升。

需要注意,此参数通常跟RECORDLENGTH参数一起使用。

OWNER

OWNER参数指定导出的用户,多个用户需要用英文逗号隔开。

在导出命令中加入此参数后,表示导出使用的是用户模式。Oracle就会导出指定用户下的所有对象。

STATISTICS

STATISTICS参数在作为导出参数时,控制是否导出统计信息。该参数有三个值,分别是:

  • ESTIMATE 默认值,
  • COMPUTE 导出时会由Oracle估算表的统计信息。
  • NONE 不导出统计信息。

imp私有参数

COMMIT

COMMIT参数指定每次插入后是否提交,默认为N,表示仅在插入完表后才提交。

DATA_ONLY

DATA_ONLY参数指定仅导入数据,不导入元数据(简单理解为创建表、创建索引等),默认为N,表示导入元数据和数据。

FROMUSER

FROMUSER参数指定备份中的用户,也就是导出的用户名,用户模式下使用。

STATISTICS

STATISTICS参数在作为导入参数时,控制是否导入统计信息。该参数有四个值,分别是:

  • ALWAYS 无论导出的统计信息是否有问题,始终导入数据库的统计信息,默认值。
  • NONE 不导入或不重新计算数据库的统计信息。
  • SAFE 导入前会先判断统计信息是否有问题,如果没有问题,则导入统计信息;否则,会重新计算优化器的统计信息。
  • RECALCULATE 不导入统计信息,但会重新计算。注意,将导入参数statistics设置为recalculate的前置条件必须要求导出参数statistics≠none才行。

TOUSER

TOUSER参数指定导入的用户,也就是备份导入到哪个用户中,用户模式下使用。

使用案例

简单说明一下案例中使用的数据库,数据库除了有Oracle官方提供的示例schema的数据,还自己新建了一个表空间TEST_DATA,并拷贝scott下的表至新的表空间中。

数据库模式

个人不建议在生产环境中使用此模式,主要是此方式的局限性很大,并且导入出错的风险也非常大,针对全库的备份还原性能也不够。

鉴于在生产环境上基本没有人会采用此方式,暂不记录此方法。

表空间模式

导出表空间

执行导出命令

exp system/orcl@192.168.3.85/orcl file=C:\Users\Administrator\Desktop\temp\test.dmp log=C:\Users\Administrator\Desktop\temp\test.log tablespaces=test_data

Oracle EXP和IMP的使用_exp

导入表空间

执行导入命令

imp system/orcl@192.168.3.85/orcl file=C:\Users\Administrator\Desktop\temp\test.dmp log=C:\Users\Administrator\Desktop\temp\test.log tablespaces=test_data full=y

Oracle EXP和IMP的使用_imp_02

用户模式

导出用户

执行导出命令

exp system/orcl@192.168.3.85/orcl file=C:\Users\Administrator\Desktop\temp\test.dmp log=C:\Users\Administrator\Desktop\temp\test.log owner=test

Oracle EXP和IMP的使用_exp_03

导入用户

执行导入命令

imp system/orcl@192.168.3.85/orcl file=C:\Users\Administrator\Desktop\temp\test.dmp log=C:\Users\Administrator\Desktop\temp\test.log fromuser=test touser=test

Oracle EXP和IMP的使用_exp_04

表模式

导出表

执行导出命令

exp system/orcl@192.168.3.85/orcl file=C:\Users\Administrator\Desktop\temp\test.dmp log=C:\Users\Administrator\Desktop\temp\test.log tables=test.salgrade

Oracle EXP和IMP的使用_exp_05

导入表

执行导入命令

imp system/orcl@192.168.3.85/orcl file=C:\Users\Administrator\Desktop\temp\test.dmp log=C:\Users\Administrator\Desktop\temp\test.log fromuser=test tables=salgrade

Oracle EXP和IMP的使用_exp_06