您的位置:首页 > 其它

Import/Export导入导出数据(理论)

2015-06-29 14:46 302 查看


原文:http://blog.itpub.net/14338195/viewspace-1052613/


Import/Export导入导出数据(理论)

Import/Export可以完成的任务:

1、 获取数据库中对象的创建脚本(如建表脚本,以及其关联的索引、约束等);

2、 备份数据。除整体导入导出外,还可以选择只导出数据库中的指定对象,或者只导出表中符合条件的数据(EXP命令提供了对应参数,能够支持WHERE查询的方式限定导出记录),这一功能是物理备份不能实现的;

3、 跨平台、跨版本迁移数据;

4、 在多个Oracle数据库之间通过传输表空间特性快速复制数据;

调用IMP和EXP

1、 创建相关视图和角色

如果是使用DBCA创建的数据库,那么DBCA会自动创建执行IMP/EXP所需的视图和角色。如果你的Oracle数据库是通过手工方式CREATE
DATABASE语法创建,那么在执行IMP/EXP之前,必须首先执行cataxp.sql或catalog.sql(后者中包含调用catexp.sql的语句)

cataxp.sql脚本文件中的语句主要执行下列任务:

1) 创建执行Import/Export所需的数据字典及相关视图;

2) 创建EXP_FULL_DATABASE角色并收取相应权限,拥有该角色的用户能够执行整库的导出;

3) 创建IMP_FULL_DATABASE角色并授予相应权限,拥有该角色的用户能够执行整库的导入;

4) 将EXP_FULL_DATABASE/IMP_FULL_DATABASE两个角色授予DBA角色。

2、 授予权限

1) 执行IMP/EXP的用户至少要有CREATE
SESSION权限(该权限包含在CONNECT角色中);

2) 拥有DBA角色的用户不用单独授予IMP/EXP权限,且拥有DBA角色的用户被称为特权用户,其所导出的DUMP文件在导入时,也必须是拥有DBA角色的特权用户。

3) 在执行跨版本的数据迁移任务,导出与导入时IMP/EXP的版本是否适当,将决定导出或导入任务能否顺利执行。有一个通用的规则,就是尽可能用低版本的EXP执行导出(源端和目标端数据库版本中,哪个低就用哪个执行导出),尽可能用目标数据库的IMP版本导入。

3、 调用方式

1) 命令行方式调用

注意:如果操作系统对于执行命令的字符长度是有限制的,如果指定的参数或参数值较多,超出了操作系统的限制,那么命令执行就会报错。对于这种情况必须使用参数文件调用方式。

2) 参数文件方式调用

IMP和EXP命令都支持PARFILE参数,该参数的作用就是指定一个参数文件。指定的参数文件是一个文本格式的文件,用户可以使用任意文本编辑工具创建或编辑,其中的内容也并无特殊,仍是EXP/IMP命令支持的那些参数。例如,创建参数文件paramter.dat:

file=d:backupuserexp.dmp

Indexes=n

buffer=20480000

……

然后通过EXP命令执行导出时,就可以通过下列方式进行:

EXP USERNAME/PASSWORD@TNSNAME PARFILE=PARAMTER.DAT

3) 交互式调用(略)

4) 处理模式

Import/Export工具在使用时提供了下列4种操作模式:

i. 整库模式:导入/导出整个数据库,必须拥有EXP_FULL_DATABASE和IMP_FULL_DATABASE角色或DBA特权,对应参数FULL;

ii. 表空间模式:导入/导出指定表空间中的对象数据,对应参数TABLESPACE;

iii. 用户模式:导入/导出用户对象,即OWNER为当前连接用户的所有对象,如果是DBA角色用户,则可以同时导出多个用户,对应IMP/EXP命令中的OWNER参数。

iv. 表模式:导入/导出指定的表或表的分区,对应参数TABLES。

5) 常用导出/导入命令

i. EXP/IMP
HELP=Y

导出

ii. exp
username/pwd@tnsname file=….dmp log=….log
owner=(username)

iii. exp
username/pwd@tnsname file=….dmp log=….log
full=y

iv. exp
username/pwd@tnsname file=….dmp log=….log
full=y rows=n //只导结构

v. exp
username/pwd@tnsname file=….dmp log=….log
tables=(tab1,tab2…)

vi. exp
username/pwd@tnsname file=….dmp log=….log
tables=(tab1) query=”’ where id>10’”

vii. exp
username/pwd@tnsname file=….dmp log=….log
tables=(tab1) direct=y recordlength=65535 buffer=10240000

viii. exp
username/pwd@tnsname parfile=parfile.dat

parfile.dat:

file=….dmp

log=….log

owner=(username)

导入

ix. 导入指定表到相同用户:

imp username/pwd@tnsname file=….dmp
log=….log ignore=y full=y

x. 导入指定表到其他用户

imp username/pwd@tnsname file=….dmp
log=….log ignore=y fromuser=user1 touser=user2

这里有些问题需要特别注意:

IMP在导入数据时会首先创建表结构,这个表结构来自于EXP导出的数据库,其中包含存储属性,并且肯定是在源端数据库的存储属性,那么IMP在目标端创建表时,存储属性仍然将继续继承源端属性,于是数据在源端存储在哪个表空间,目标端时仍然会寻找并存储到那个表空间。如果找到了,就会存储到那个表空间中,否则,那就会报错。

因此将数据导入到其他用户时就要注意这个问题了:

场景1:虽然导入的用户不同,但其缺省表空间和导出用户表空间相同,则没问题;

场景2:导入的用户不同,且其缺省的表空间和导出用户表空间也不同,但数据库中有导出用户的表空间,如果此时不做任何处理直接调用上面命令导入,其结果是不会报错,但实际上确实将数据导入到和导出时同名的那个表空间了,显然不符合我们的初衷。此时需要这样提前处理:

SQL>conn / as sysdba

SQL>alter user impusername quota unlimited on impusertbspace;

SQL>revoke unlimited tablespace from impusername;

如果用户需要对多个表空间拥有读写权限,需要执行多条alter user quota语句进行授权;其中impusertbspace是导入用户的缺省表空间名。

xi. 导入含LOB类型的表:

我们在报错信息中找到这样的语句

create table “LOBTBL” (“ID” NUMBER, “DESCRIPT” CLOB);

于是我们以导入用户连接到数据库,执行该命令创建LOBTBL表即可。

如果导入的数据中含有LOB、分区表、分区索引等类型的对象,都按照上面示例中进行操作。也就是说必须首先在目标数据库中创建这些对象,然后才能执行导入操作。

xii.

6) 常见导出/导入注意事项

i. BUFFER的计算方法:记录总条数*记录行的最大长度

导出

ii. EXP-00091(Exporting
questionable statistics)错误:

执行导出任务的客户端字符集问题

首先查询数据库中的字符集:

SQL>select * from v$NLS_PARAMETERS where parameter=’NLS_CHARCTERSET’;

然后再执行导出任务的客户端设置NLS_LANG变量:

set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

iii. EXP-00904错误:

导出端版本和数据库版本不一致。

iv. 生成Dump文件的数据库版本,如果比目标数据库的版本高,那么有可能失败;

v. DBA导出的,导入时也需要DBA权限;

vi. 导出的数据中是否包含LOB类型,是否有分区表、分区索引等,如果有需要提前做些准备;

vii. IMP导入时的逻辑过程:创建表,插入数据,创建位图索引,创建完整性约束和触发器等并启用,最后导入其他类型的索引。

导入

viii. 如果要导入的序列在目标端不存在,那么不会有问题,不过如果目标端已经存在同名的序列对象,则对于该序列导入问题可能会有问题存在。

解决办法就是在导入前,删除同名的序列!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: