Oracle Exp/Imp常见问题

Oracle Exp/Imp常见问题

 

使用EXP/IMP前应该考虑的因素:

EXP

1

如果通过DBCA界面方式创建的数据库,那么DBCA会自动创建执行IMP/EXP所需的视图角色

如果数据库是通过手动创建(create database***),那么在执行IMP/EXP之前,必须首先执行cataxp.sqlcatalog.sql(包含调用cataexp.sql的语句)

cataxp.sql脚本文件中主要执行以下任务:

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

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

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

4)将EXP_FULL_DATABASE/IMP_FULL_DATABASE两个角色授予DBA,注意这个DBA不能指操作作者本人,而是Oracle数据库中的角色,也就是管理员角色。

 

2 授予权限:

执行IMP/EXP的用户至少要有CREATE SESSION权限,即连接数据库的权限,该权限包含在CONNECT角色中。

默认情况下,用户只能导出自己的表,要导出其他SCHEMA拥有的表,执行导出的用户还必须拥有EXP_FULL_DATABASE角色,如果导入其他SCHEMA,执行导入用户必须拥有IMP_FULL_DATABASE角色。

grant create session to scott;

grant exp_full_database to scott;

grant imp_full_database to scott;

 

IMP

EXP命令是向Dump文件中写数据,而IMP命令则是从Dump文件中读数据。

导入之前应该考虑的因素:

1)生成DUMP文件的数据库版本,如果比目标服务器数据库版本高,那么导入可能失败;

2)生成DUMP文件的用户及该用户拥有的角色,如果导出时是DBA用户,或拥有EXP_FULL_DATABASE角色的用户执行的全库导出,那么导入时的用户也必须要拥有相应的权限;

3)导出的数据库中是否含有LOB类型,是否有分区表,分区索引,外部表等,如果有,可能在导入前也需要做一些准备工作;

4)源数据默认表空间和目标数据默认表空间是否相同;

 

EXP/IMP的调用方式:

EXP

1)交互式

exp help=y

2)参数文件方式

IMP/EXP命令都支持PARFILE参数,该参数的作用是指定一个参数文件。指定的参数文件是一个文本格式的文件

例如:

vim parameter.dat

file=/home/oracle/scott.dmp

indexes=n

buffer=20480000

......

exp scott/tiger parfile=parameter.dat

当参数过多,或字符串过长等适合用交参数文件方式。

当参数文件和命令参数有冲突时,一般以最后读到的参数为准。

3)命令行方式

 

IMP

1)交互式

2)参数文件方式

3)命令行方式

 

EXP处理模式

EXP

1)表模式

exp scott/tiger file=a.dmp log=a.log tables=emp compress=n

exp scott/tiger file=a.dmp log=a.log tables=(emp,dept) compress=n

exp scott/tiger file=a.dmp log=a.log tables=emp query="'where deptno=20 and ename!="SCOTT"'" compress=n

exp scott/tiger parfile=parameter.txt compress=n

vim parameter.txt

tables=emp

query='where deptno=20 and ename!="SCOTT"'

2)用户模式

exp scott/tiger file=a.dmp log=a.log owner=scott compress=n

exp scott/tiger file a.dmp log=a.log owner=(scott,chen) compress=n

3)整库模式

exp scott/tiger file=full.dmp log=full.log full=y

只是逻辑上的全库,只导出了和用户数据相关的对象。

4)表空间模式

 

IMP

1)表模式

2)用户模式

3)整库模式

4)表空间模式

 

 

EXP常见问题

影响EXP/IMP导出导入的因素:

1)compress=N

在执行exp导出的时候,如果不指定compress=N会遇到的问题(默认初始值是Y),那么exp会尝试压缩表的extent:根据表中所有的extent的大小创建一个很大的初始extent,将表的全部extent压缩到一个extent中。如果利用这样导出的dmp文件再导入到目标库的话,目标库创建的对应的表的初始extent将会非常大,这样即使truncate这张表后,保留的使用的空间依然会很大。

2)EXP-00091: Exporting questionable statistics.

出现场景:EXP-00091错误常在crontab执行脚本时出现;

问题原因:执行导出命令的客户端NLS_LANG参数未设定或设定不合理;

解决方法:

查询目标数据库的字符集

select * from v$nls_parameters where parameter='NLS_CHARACTERSET';

然后在执行exp命令的客户端设置NLS_LANG变量;

3)ORA-00904

执行EXP命令的客户端数据库版本不能高于服务器端数据库版本;否则含LOB自动的数据在导出时可能会失败;

4) 执行导出莫名停顿,但dump文件大小疯涨

原因:导出外部表时,如果外部表是通过ORACLE_LOADER方式创建的,那么在导出时只导定义,不导数据;

如果外部表时通过ORACLE_DATAPUMP(10g)导出,不仅不导出数据,导出表定义会触发BUG,使得DUMP疯涨,10.2.0.3以后已经修改了BUG

5)导出文件过大,超出文件系统限制怎么办?

不同的文件系统,支持的单个文件最大容量不同。

例如:

FAT16:单个文件不超过2GB

FAT32:单个文件不超过4GB

NTFS:单个文件不超过2TB

Ext2Ext3:单个文件不超过2TB

通过参数FILESIZE可以限制单个文件大小,默认单位为字节

exp scott/tiger filesize=100M file=scott.dmp log=scott.dmp owner=scott compress=n

SQL> select sum(bytes) from user_segments;

SQL> select owner,sum(bytes) from dba_segments where owner in(CHEN,SCOTT) group by owner order by 2 desc;

 

6)试试能否更快的导出?

导出方式:

1)常规路径(Conventional Path)

2)直接路径(Direct Path)

常规路径(Conventional Path)导出是EXP默认的导出方式,在这种方式下,EXP要处理的数据需要经过SQL SELECT语句的方式提取,将数据读取到缓冲池,经由Evaluatin Buffer处理后返回到Export客户端,最后被导入到DUMP文件。

要提供处理速度,最重要的参数是BUFFER。该参数用于指定执行导出时,处理数据所用的缓冲区的大小,以字节为单位。这个参数变相用来控制导出时记录数组单次最大能加载的记录数。

缓冲区大小与加载记录数之间可以通过下列公式换算:

缓冲区大小=记录数组大小×记录行最大值

例如:

buffer默认是4096字节

当导出大表时,可以加大buffer,提高导出速度

exp chen/chen file=a.dmp log=a.dmp owner=chen buffer=5120000 compress=n

 

直接路径(Direct Path)

直接路径(Direct Path)也需要先把数据加载到数据库缓冲池,不过不需要再经过Evaluatin Buffer处理,而是直接返回到Export客户端并写入指定的DUMP文件。

需要在执行exp命令时指定参数DIRECT值为Y(默认值为N)

影响直接路径导出效率的另一个参数是:RECORDLENGTH,该参数用来指定ExportI/O Buffer,以字节为单位,最大不超过65535

例如:

exp test/test file=a.dmp log=a.dmp owner=test direct=Y recordlength=65535 compress=n

 

IMP常见问题

问题一:

test用户下的表,导入到chen用户下

其中test用户默认表空间test_tab,chen用户默认表空间chen_tab

imp chen/chen file=test.dmp log=test.log fromuser=test touser=chen

由于导入时,会将scott.dmp的存储定义也导入到chen用户下,即导入后chen用户下的表默认表空间并不是chen_tab,而是test_tab;

其中:

如果chen所在数据库中有test_tab表空间,那么可以正常导入;如果没有,导入时会报错并且终止;

问题原因:由于RESOURCE角色包含unlimited tablespace权限,该权限的作用是允许用户拥有无限操作表空间存储的权限。这可能导致在imp导入数据库时使得数据存储在了预想以外的表空间。

解决办法:

1)显式的授予用户指定表空间的存储权限,希望用户操作哪个表空间,就授予哪个表空间的操作权限;

SQL> alter user chen quota unlimited on chen_tab;

2)然后回收Unlimited Tablespace权限

SQL> revoke unlimited tablespace from chen;

这时在将test用户下的表导入到chen用户下时,所使用的表空间就可以是chen_tab了,但是前提必须加参数IGNORE(忽略错误),否则会终止导入;

imp chen/chen file=test.dmp log=test.log fromuser=test touser=chen ignore=y

 

问题二:

导入含LOB类型的表,且表空间和当前用户默认表空间不同

如果导入的用户默认表空间与数据的原存储表空间不同,并且表中含有LOB类型或分区表、分区索引之类的对象。这种类型的导入,处理将会更复杂,甚至无法直接使用IGNORE参数解决问题。

可以根据错误提示手动创建表定义设置适合的存储参数

 

问题三:

SEQUENCE序列未变

如果导入的SEQUENCE在目标端不存在,那么不会有问题;

如果在目标端已经存在同名的SEQUENCE对象,并且在IMP导入时指定IGNORE=Y参数,那么导入可以顺利完成,不过导入的结果并不是预期想要的。

IMP导入时指定IGNORE=Y参数,对于已经存在的对象会忽略创建语句导致的错误,问题在于SEQUENCE对象的属性恰恰是CREATE SEQUENCE时指定的(IMP并不会将创建语句转换成修改属性语句),看起来SEQUENCE对象导入成功,但其实IMP什么也没做。

解决办法:导入之前,删除同名的SEQUENCE对象;

 

导入速度的提升:

BUFFER

imp chen/chen file=scott.dmp log=scott.log fromuser=scott touser=chen buffer=40960000

 

EXP常用参数:

1 file

2 log

3 owner

4 tables

5 full

6 buffer

7 compress

8 GRANTS:指定是否导出对象的授权信息,默认参数值为Y,即默认导出;

9 INDEXES:指是否导出表的所有,默认为Y

10 CONSTRAINTS:指是否导出表的约束,默认值Y

11 TRIGGERS:指是否导出与表相关的触发器,默认值Y

12 direct

13 recordlength

 

IMP常用参数

1 file

2 log

3 fromuser

4 touser

5 ignore

6 buffer

 

IMP在导入表对象时的顺序与EXP导出表对象的顺序相同:

1)导入表定义,即创建表对象;

2)导入表数据;

3)导入索引数据;

4)创建完整性约束、视图、过程及触发器;

5)导入BitmapFunction-Based以及Domain等类型索引;

 

对象类型:

聚簇分析,统计信息,应用程序上下文,审计信息,聚簇定义,数据库链,默认角色,维度,Directory,外部表(不含数据),索引类型,Java Resources and classesJOB队列,嵌套表序列,对象的授权,用于表的对象类型定义,对象类型的定义,用户定义的同义词,用户概要文件(profiles),公共同义词,外键约束,角色及授权,回滚段定义,序列,物化视图、物化视图日志及刷新组,授予的系统权限,表结构、表数据、表索引、约束、触发器及表和列的注释,表空间的定义,表空间使用限额,用户定义,用户代理,用户视图,用户定义的函数、过程、包;

 

 

参考:《涂抹Oracle

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29785807/viewspace-1775112/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29785807/viewspace-1775112/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值