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. 如果要导入的序列在目标端不存在,那么不会有问题,不过如果目标端已经存在同名的序列对象,则对于该序列导入问题可能会有问题存在。
解决办法就是在导入前,删除同名的序列!
相关文章推荐
- Linux关闭防火墙命令
- 影视作品烂到至高无上的境界不是槽点满满
- PP几个表关系
- UVA 575 Skew Binary (水)
- mysql创建索引大全
- HBase学习总结(2):HBase介绍及其基本操作
- Linux环境下,通过FTP下载7z压缩包出现数据丢失
- 数据结构:回溯法与树的遍历
- android中跨进程通讯的4种方式
- 【MIG专项测试组】如何准确评测Android应用的流畅度?
- Java PriorityQueue Class Example
- 算法基础---全排列算法
- C#计算函数执行的时间
- 如何能“蒙对”新GRE填空?
- hadoop三种运行形式
- openfire-spark 二次开发-(二)运行环境配置
- 通过Sqoop实现Mysql / Oracle 与HDFS / Hbase互导数据
- IDOC实例, Outbound IDOC
- 织梦如何实现二级栏目导航的仿制
- SIGPIPE信号的处理