当前文档以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
导入示例
这里导入会报一堆错,就不截图了,错误多数是表已存在,视图已存在等错误。
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
导入示例
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
用户的导出和导入
以下示例是在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
导入示例
表的导出和导入
以下示例是在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
导入示例
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