imp相当于是exp的反向工程。
1、执行imp命令与exp相同,也是有三种调用方式:
* 命令行调用
* 参数文件调用
* 交互方式调用
2、同时,执行imp命令导入数据时也分为4种模式:表模式、用户模式、表空间模式和数据库模式
3、执行导入前务必搞清楚的几个问题:
* 生成Dump文件的数据库版本,如果比目标数据库服务器的版本高,那么导入有可能会失败。
* 生成Dump文件的用户及该用户拥有的角色。如果导出时是DBA用户或拥有EXP_FULL_DATABASE角色的用户执行的全库导出,那么导入时的用户也必须要拥有相应的权限。
* 导出的数据中是否包含LOB类型,是滞有分区表、分区索引等,如果有,可能导入前也需要做一些准备工作。
4、导入指定表到相同用户,import在导入表对象时的导入顺序与export导出表时的读取顺序相同:
* 导入表定义,即创建表对象。
* 导入表数据。
* 导入表索引数据。
* 创建完整性约束、视图、过程及触发器。
* 导入Bitmap、Function-Based以及domain等类型索引。
如果直白的语言形容,大概是这么个过程:先创建表,然后插入数据,创建位图索引,创建完整性约束和触发器等并启用,最后导入其它类型的索引
示例:
1、导入指定表到相同用户:
注:这项操作是在假设目标端数据库SCOTT的默认表空间与要导入的两个表的原存储表空间名完全相同的情况下进行的。
2、导入指定表到其它用户,这个需注意的是在创建用户时需指定用户默认表空间,同时需给用户无限制的使用权限,并且去掉对其它表空间的操作权限。
SQL> create user mgp identified by tiger default tablespace mgp_tbs quota unlimi
ted on mgp_tbs;
如果创建时没有指定用户无限制使用权限,则需作以下修改:
SQL> alter user mgp quota unlimited on mgp_tbs;
SQL> revoke unlimited tablespace from mgp;
注:如果用户对多个表空间有读写权限,则需要执行多次alter与revoke
通过上述修改才能确保正确地把用户scott的表导入到新用户mgp上:
再次确认是否在相应的用户与表空间中:
两表所在的空间都是正常的,目标已达成。
注 : FROMUSER:该参数指定对象的原有属主;
TOUSER:该参数指定对象的新属主,即要导入到的用户。
IGNORE :该参数是IMP的重要参数,作用是忽略当前的错误信息,并继续执行操作,如果未指定该参数,则导入命令就会提示出错并中止运行。
3、导入含LOB类型的表,且表空间与当前用户默认表空间不同。
如果要导入的用户默认表空间与数据的原存储表空间不同,并且表中含有LOB类型或分区表、分区索引之类的对象。这种类型的导入,处理将会更加复杂,甚至无法直接使用IGNORE参数解决问题。
示例:
导入失败,报错信息为ORA-01950,没有权限操作SCOTT_TBS表空间,其实报什么错不重要,对于这类问题处理方式都一样。首先格式化上述报错信息中的sql语句:
CREATE TABLE "LOBTAL"("ID" NUMBER, "DESCRIPT" CLOB);
在sql*plus命令环境中相对应的用户下执行上述语名创建表格。
然后再重新执行导入操作。
4、导入表结构到指定用户:
我们可能会接到这样的需求,希望参照现有数据库结构,搭建一个新的测试数据库(也许过不了多久就成了正式库),完全复制现有系统的结构,不过只要结构不要数据。
imp scott/tiger @172.65.12.50 full=y file=exp_201205_scott.dmp log=imp_201205_scott.log ignore=y rows=n
注:从上述语句可以看到,exp命令也支持rows参数,该参数的作用与imp中同名参数完全相同,对于仅导入结构的实施需求,一般建议在使用exp导出时指定rows参数,这样既可以有效提高导出效率,降低导出时间,而且由于仅导出了结构信息,生成的dump文件相对会小很多,复制dump文件到其他服务器时也将更有效率。
5、imp导入常见问题:
(1)对象已经存在
因默认情况下ignore=n,导入就会报错,然后中止对当前的操作,如果ignore=y,imp会自动忽略对象已存在的事实,继续导入数据,如果当前操作的对象类型是表的话,不管要插入的表中是否有数据,或者是否与要插入的数据有重复,imp都会将dump中的数据插入该表中。不建议这种处理方式。
(2)记录不规范
通常是由于记录的来源表与目标表结构不一致造成的,最容易被识别的是表结构不同。
(3)SEQUENCE序列未变
如果导入的sequence在目标端不存在,那么不会有问题,不过如果目标端已经存在同名的sequence对象。就会出现导入不符合你的预期。对于这类问题的解决方案很简单,在导入前,删除同名的sequence对象即可。
(4)表中记录被重复导入。
指定ignore参数为y,并且要导入的表中不含唯一索引、唯一约束的话,就极有可能出现类似问题。
(5)记录未被完全导入:
这一条与前一条正好相反,如果执行imp时指定了ignore参数为y,要导入的表中包含唯一索引、约束或其它约束检查,那么一旦发现有不符合约束条件,导入就会报错。
记录完整性约束包括以下几项:
* NOT NULL
*唯一约束
*主键(或NOT NULL+唯一索引)
*外键
*CHECK约束
6、提高导入数据速度
还是要使用到buffer参数,在导入过程中指定buffer
imp scott/tiger file =exp_201205_scott.dmp log=imp_201205_scott.log fromuser=gmp touser=scott buffer=40960000
除了指定buffer参数外,还有两个参数可能会对导入效率产生影响。
commit参数:默认情况下,imp在执行导入时会在每成功导入一张表时执行提交,设置commit=y参数后,imp根据导入数组决定是否提交(导入数组基于buffer参数的设置,根据你的buffer的大小决定每次提交的数量,因此设置本参数时强烈建议与buffer参数搭配使用)。
INDEXFILE参数:默认情况下imp在导入数据时,如果有索引则会首先处理数据,然后再创建索引,由于创建索引有可能花费大量时间。执行imp命令时指定indexes=n,通过这种方式提高imp执行的速度,等数据成功导入后,再手动连接到数据库中创建相关索引,手工导入是项多艰苦的休力活,使用imp命令中indexfile参数并指定一个输出文件路径,则要导入的对象所涉及的索引都会生成到该文件中,然后待数据导入完成后,手工编辑该文件并拿到数据库端执行即可。
库外优化:
1、均衡磁盘I/O
2、如果可以的话,关闭归档模式
3、如果可以的话,停止oracle数据库当前其它正在执行的操作,以集中数据库可用资源来执行加载工作。
本文转自pimg200551CTO博客,原文链接:http://blog.51cto.com/pimg2005/853697 ,如需转载请自行联系原作者