使用导出(exp)和导入(imp)移动数据
导出和导入实用程序
导出和导入实用程序使管理员能够在 Oracle 数据库之间和 Oracle 数据库内部
将数据移动到不同的表空间或用户或重新组织数据以获得高效的存储和性
能
导出实用程序
导出实用程序可用于制作操作系统二进制文件的对象定义和数据的逻辑副本
导出可写入磁盘或磁带上的文件导出实用程序在每个表中提取一致的数据视
图
导入实用程序
导入实用程序可以读取由导出实用程序创建的操作系统文件并将对象定义和
数据复制到 Oracle 数据库中导入实用程序不能读取文本文件或用任何其它格
式创建的文件
导出和导入的用途
重新编排表
将一个用户所拥有的数据移至另一用户
在两个数据库之间移动数据:
– 从开发到生产
– 从 OLTP 系统到数据仓库
将数据库移植到另外的:
– 操作系统平台
– Oracle 数据库发行版
开发或升级期间重复测试运行
执行逻辑备份
使用导出和导入
导出和导入可用于下列情况
重新组织表很多情况都需要重新组织表
– 可能需要将数据从一个表空间移动到另一个表空间以使争用减到最
少减少空闲空间碎片或为了易于备份
– 表可能包含很多移植的行
– 表可能包含很多有大量空闲空间的块
– 表可能包含很多位于高水位标记以下的空块
将一个用户拥有的数据移动到另一个用户当需要从数据库中删除某个方案
或需要重新分发对象所有权时可能必须进行上述操作从一个用户导出的
数据可以导入到不同用户的方案中
在数据库之间移动数据通过只提取定义而忽略数据可将对象定义从开发
数据库移动到生产数据库导出和导入还可用于将数据从 OLTP 应用程序提
取到数据仓库中
移植到不同的操作系统平台或 Oracle 版本在一台计算机上导出的数据可
以导入到不同计算机上的数据库中该计算机可能使用不同的字符集
移植到不同版本的 Oracle 数据库升级到新版本的 Oracle 服务器时可以
从旧版本中导出数据并导入到新版本中注意不能使用该方法将数据从新
版本移至旧版本中
在开发或升级过程中重复运行测试在开发或测试数据库中应用程序可
能需要先进行多次测试后才能被充分调试和接受可以将测试数据导出到外
部文件并在每次运行前导入以确保在同一数据集上执行测试该方法还可
用于在升级生产数据库之前测试新版本的 Oracle 服务器
执行逻辑备份可导出数据库中的所有或部分对象并且导出文件可用作逻
辑备份
三种导出模式
导出实用程序提供三种导出模式
表
用户
数据库
表模式
所有用户都可以使用表模式导出自己的表特权用户可以导出任何用户所拥有
的表使用表模式导出
表定义
表中的数据如果要求
若由特权用户执行导出则将导出表上的所有索引否则只能导出该用
户所拥有表上的索引
仅当特权用户运行该实用程序时才可导出表上的所有触发器否则只
能导出该用户所拥有表上的触发器
表上的约束
在表上进行的所有授权
在导入时使用的分析方法定义
用户模式
用户模式导出的工作方式随运行导出的用户是否有特权而异
特权用户可以导出任何用户所拥有的对象在这种情况下导出的对象是
– 用户拥有的所有对象除了该用户拥有的但位于其他用户所拥有表上
的索引和触发器
– 其他用户在该用户的表上创建的触发器和索引
非特权用户只能导出自己拥有的对象且该模式不包括其他用户在该用户所
拥有表上创建的索引或触发器
完全数据库模式
使用该模式时除了用户 SYS 所拥有的对象以外将导出数据库中的所有对
象该模式要求特殊权限且只能由部分用户使用
常规路径
该术语指格式化数据库数据并将其写入导出文件的缺省方法常规路径导出使
用 SQL SELECT 语句从表中提取数据数据从磁盘读入缓冲区高速缓存行则
传送到求值
缓冲区传递了表达式求值后数据传送到导出客户端后者随后
将数据写入导出文件
直接路径
直接路径导出直接读取数据并绕过 SQL 命令处理层因此提取数据的速度比常
规路径导出快得多在直接路径导出中数据从磁盘读入缓冲区高速缓存行
则直接传送到导出进程这种导出方式绕过了求值缓冲区即不重新组织块中
的数据以使行块组合在一起数据已经是导出所期望的格式因此避免了不必
要的数据转换数据传送到导出进程然后该进程将数据写入导出文件
导入实用程序能够使用由任何路径创建的导出文件使用的导出路径对执行导
入所花的时间不会有太大影响
使用导出
$exp scott/tiger tables=(dept,emp) \
> file=emp.dmp log=exp.log \
> compress=n direct=y
使用导出
可通过以下方式调用导出
命令行
交互模式
图形界面若有
提供交互模式主要是为了向后兼容它只提供命令行提供的部分选项因此
建议使用命令行模式
命令行
在 UNIX 或 Windows NT 上使用以下命令执行导出
$exp [keyword=]{value|(value, value …)}
[ [ [,] keyword ]{value|(value, value …)} ] …
此处关键字是下一节所讨论的关键字之一
值是指定给关键字的值
命令行参数
以下显示了一些常用的参数
关键字 缺省值 含义
USERID Oracle 用户名和口令若未指定口令则用户将被提示输入口令
BUFFER 操作系统特有的 用于在行写入导出文件之前存储提取行的缓冲区
大小
COMPRESS Y Y 值指定导入时初始区大小值将设置为等于段的当前大小
N 值将导致保留当前区的大小导出时必须进行选择
因为选择的信息要写入导出文件不收缩 LOB 段
CONSISTENT N Y 值指定在一个只读事务中执行整个导出操作
导出将尝试获取所有导出对象的读一致性图像
N 值指定只需维护表级一致性
CONSTRAINTS Y Y 值指定连同约束一起导出表N 值导致不导出约束
DIRECT N Y 值指定导出使用直接路径N 值使用常规路径
FEEDBACK 0 将该参数指定为整数 n 以请求在导出 n 行时显示
句点 (.) 零缺省值表示不显示句点
FILE expdat.dmp 输出文件名
FULL N Y 值指定完全数据库导出
GRANTS Y Y 值指定导入时还必须保留所有导出对象上的权限
HELP N Y 值显示有关参数及其含义的列表此参数不与其它参数合用
INDEXES Y Y 值使索引导出
LOG NULL 用于存储所有导出消息的文件名缺省情况下只在屏幕上显示消息
OWNER 进行用户级导出的用户名
PARFILE 指定包含导出参数列表的文件名
RECORDLENGTH 操作系统特有的 输出记录的大小
ROWS Y Y 值指定将导出数据
STATISTICS ESTIMATE 指定导入时使用的分析方法
TABLES 方案表用于表模式导出
注释
只可以定义下列参数之一FULL=Y WNER=user 或
TABLES=schema.table
如果指定直接路径 (DIRECT=Y) 则 CONSISTENT 参数不能设置为 Y
使用导入
导入emp.dmp
$imp scott/tiger tables=(dept,emp) \
> file=emp.dmp log=imp.log ignore=y
使用导入
可通过以下方式调用导入
命令行
交互模式
图形界面若有
提供交互模式主要是为了向后兼容它只提供命令行提供的部分选项因此
建议使用命令行模式
命令行
在 UNIX 或 Windows NT 上使用以下命令执行导出
$imp [keyword=]{value|(value, value …)}
[ [ [,] keyword ]{value|(value, value …)} ] …
此处关键字是下一节将讨论的关键字之一
值是指定给关键字的值
命令行参数
以下显示了一些常用的参数
关键字 缺省值 含义
USERID Oracle 用户名和口令如果未指定口令则将提示
用户输入口令
BUFFER 操作系统特有的 传送数据行的缓冲区大小以字节为单位
COMMIT N Y 值指定导入应在每个数组插入后提交缺省情况
下只在装载每个表后提交导入在继续下一个对
象前若发生错误则导入执行回退指定
COMMIT=Y 以防止回退段无限增大
FEEDBACK 0 将该参数指定为整数 n 以请求在导入 n 行时显示句
点 (.) 缺省值禁止显示
FILE expdat.dmp 输入文件名
FROMUSER NULL 导入对象所属的用户列表
FULL N Y 值指定完全数据库导入
GRANTS Y Y 值指定还必须导入所有导入对象上的权限
HELP N Y 值显示有关参数及其含义的列表此参数不与其它参数合用
IGNORE N 如果值为 Y 则导入在尝试创建数据库对象时将忽
略对象创建错误在这种情况下导入不报告错
误继续进行对于表IGNORE=Y 使行导入现有
表不显示任何消息IGNORE=N 导致报告错误
如果表已存在则跳过表
注意只忽略对象创建错误不忽略其它错误如
操作系统错误数据库错误和 SQL 错误并可能导
致处理停止
INDEXES Y Y 值导致索引导入
INDEXFILE NULL 指定文件接收索引创建命令若指定了该参数则
请求模式的索引创建命令将被提取并写入指定文
件而不用于在数据库中创建索引不导入表和其
它数据库对象
然后可以编辑文件例如更改存储参数并将
其用作创建索引的 SQL 脚本
LOG NULL 用于存储所有导入消息的文件名缺省情况下只在屏幕上显示消息
PARFILE 指定包含导入参数列表的文件名
RECORDLENGTH 操作系统特有的 输入记录的大小仅当在记录大小不同的操作系统
上导出数据时才需要此参数
ROWS Y Y 值指定导入数据
SHOW N 如果值为 Y 则只显示而不导入列出的导出文件内
容导出中包含的 SQL 语句按导入时 SQL 语句的
执行顺序显示如果 SHOW=Y 则唯一可以设置
的其它参数为 FROMUSER TOUSER FULL 和TABLES
TABLES NULL 要导入的表名
TOUSER NULL 要导入表的用户名列表只有具有
IMP_FULL_DATABASE 角色的用户才可以使用
该参数将对象导入其他用户的帐户
注释
只可以定义下列参数之一FULL=Y WNER=user 或
TABLES=schema.table
导入行为
导入顺序:
表->数据->B 树索引->约束, 触发器, 位图索引
对象使用的表空间:
– 源数据库中的相同表空间 (如果有)
– 用户的缺省表空间
导入顺序
表对象按照从导出文件读取的顺序导入导出文件按下列顺序包含对象
1 类型定义
2 表定义
3 表数据
4 表索引
5 完整性约束视图过程和触发器
6 位图函数和域索引
该顺序防止因导入表的顺序而拒绝数据该顺序还可防止在同一数据上两次触
发冗余触发器一次在初始插入时一次在导入时
但是某些对象如过程在导入时可能因为是在它们所引用对象之前导入的
而无效使用 STATUS=INVALID 检查对象并重新编译它们
导入现有表的注意事项
将数据导入现有表时导入顺序仍然会产生引用完整性失败如果表上的引用
完整性约束在导入结束时引用自身则也会发生类似的情况
出于上述原因导入现有表时禁用引用约束是一个好办法导入结束后可以
重新启用约束
用于对象的表空间
如果用户有必需的限额则将表导入它们导出时所在的同一表空间但是如
果这样的表空间已不存在或者用户没有必需的限额则导入将在该用户的缺省
表空间内创建表如果用户无法访问缺省表空间则无法导入表
只能将 LOB 段导入它导出时所在的同一表空间因此如果表所有者不能在导
出 LOB 段的表空间内创建对象则将无法创建包含 LOB 的表
导出和导入原则
使用参数文件指定常用命令行选项
仅在导出少量数据时使用 CONSISTENT=Y
如果存在许多已删除的行, 请勿使用 COMPRESS=Y
通过以下操作提高性能:
– 分配大容量缓冲区
– 若使用 7.3.3 或更高版本, 则使用直接路径
导出和导入原则
使用参数文件存储常用的命令行参数这可使错误减到最少并使命令行保持较
小
如果正导出的表上存在大量的更新操作使用 CONSISTENT=Y 很可能会产生
SNAPSHOT TOO OLD 错误通常在操作低峰时期运行较大的输出会更好
或者创建一个较大的回退段使所有其它的回退段脱机然后执行导入
导出选项 COMPRESS=Y 将生成创建初始区的代码初始区的大小等于当前分
配给对象的所有区的总大小如果对象上有很多已删除的行或者如果上一个
区有很多未使用的块这将不必要地分配给对象很多空间
分配计算机上的操作系统和资源所允许的缓冲区大小如果将数据导入运行
7.3.3 版或更高版本的数据库则使用直接路径导出
经过测试在exp命令中使用driect=y采用直接路径导出比常规路径要快2-3倍
常规路径
该术语指格式化数据库数据并将其写入导出文件的缺省方法常规路径导出使
用 SQL SELECT 语句从表中提取数据数据从磁盘读入缓冲区高速缓存行则
传送到求值
缓冲区传递了表达式求值后数据传送到导出客户端后者随后
将数据写入导出文件
直接路径
直接路径导出直接读取数据并绕过 SQL 命令处理层因此提取数据的速度比常
规路径导出快得多在直接路径导出中数据从磁盘读入缓冲区高速缓存行
则直接传送到导出进程这种导出方式绕过了求值缓冲区即不重新组织块中
的数据以使行块组合在一起数据已经是导出所期望的格式因此避免了不必
要的数据转换数据传送到导出进程然后该进程将数据写入导出文件
导入实用程序能够使用由任何路径创建的导出文件使用的导出路径对执行导
入所花的时间不会有太大影响
导出和字符集转换
常规路径导出在写入导出文件时使用为用户会话指定的字符集如 7 位 ASCII
或 IBM 代码页 500 (EBCDIC)
直接路径导出只使用数据库字符集导出启动导出时如果导出会话的字符集
和数据库字符集不同则导出显示警告并中止在重新尝试导出前将会话字
符集指定为与数据库字符集相同
导出文件包含一个标识用于显示其字符数据所使用的字符编码方案
导入和字符集转换
导入会话和目标数据库字符集可以不同于源数据库字符集这种情况要求一个
或多个字符集转换操作
如有必要在导入时首先将导出文件数据转换到为用户会话指定的字符编码方
案然后转换到数据库字符集
转换期间导出文件中所有在目标字符集中无等效字符的字符都用缺省字符代
替这些缺省字符由目标字符集定义若要保证 100% 转换目标字符集必须
是源字符集的超集或等效于源字符集
原则
因为字符集转换延长了导入所需的处理时间所以应尽可能地限制字符集转换
次数最理想的情形是导入会话和目标数据库字符集与源数据库字符集相
同不要求转换