原文: https://www.enmotech.com/WEB/detail/1/788/1.html 导读:本文来自读者“小豹子加油(网名)”的投稿,主要讲述使用
原文: https://www.enmotech.com/WEB/detail/1/788/1.html
导读:本文来自读者“小豹子加油(网名)”的投稿,主要讲述使用imp导入文件出现IMP-00009问题的处理过程。
一、概述
最近在测试环境的一个oracle数据库上面,使用exp将表导出没有问题,而将导出的文件使用imp导入时却出现了如下错误。
IMP-00009: abnORMal end of export file
Import terminated successfully with warnings.
经过反复实验,终于找出问题出现的原因,是由以下几点共同造成的:
a. 数据库中参数deferred_segment_creation设置的是默认值true,即创建表的时候不立即分配段,等有行的时候才会分配段。
b. 导出的表中有分区表,而恰好该分区表存在分区没有行的情况,即有的分区没有分配段。
c. 导出时使用了direct=true。
解决办法直接看(三、解决办法)
二、问题复现
1. 准备工作
在测试库中准备两个用户,tom(导出的用户),jerry(导入的用户),分别给予其最大的权限。
sql> create user tom identified by tom;
SQL> grant dba to tom;
SQL> create user jerry identified by jerry;
SQL> grant dba to jerry;
2. 检查数据库中参数deferred_segment_creation
SQL> show parameter deferred
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
可以看到该参数是true,默认值。
3. 创建测试表
SQL> create table tom.t_normal as select * from scott.emp; // 创建一张普通表,并且有行
SQL> create table tom.t_norows as select * from scott.emp where 1=0; // 创建一张空表
SQL> create table tom.t_par(id number, name varchar2(10))
partition by list(id)
(partition p01 values(1),
partition p02 values(default)); // 创建一张分区表,两个分区
SQL> insert into tom.t_par values(1, 'aa'); // 往分区p01插入一条数据
SQL> commit;
至此,tom用户下有三张表,t_normal是普通表,t_norows是一张普通的空表,t_par是分区表。
通过下面的sql查到tom用户下只有两个segment,空表和分区表中无数据的分区都没有创建段。
SQL> select owner,segment_name,partition_name,segment_type from dba_segments where owner='TOM';
OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
---------- -------------------- ------------------------------ ------------------
TOM T_NORMAL TABLE
TOM T_PAR P01 TABLE PARTITION
4. 使用tom对表进行导出
exp tom/tom file=tom.dmp log=tom_exp.log direct=true
导出日志如下(省略部分无关内容):
. . exporting table T_NORMAL 14 rows exported
. . exporting table T_NOROWS 0 rows exported
. . exporting table T_PAR
. . exporting partition P01 1 rows exported
. . exporting partition P02 0 rows exported
Export terminated successfully without warnings.
5. 使用jerry对文件进行导入
mp jerry/jerry file=tom.dmp log=jerry_imp.log fromuser=tom touser=jerry
导入日志如下(省略部分无关内容):
. . importing table "T_NORMAL" 14 rows imported
. . importing table "T_NOROWS" 0 rows imported
. . importing partition "T_PAR":"P01" 1 rows imported
. . importing partition "T_PAR":"P02"
IMP-00009: abnormal end of export file
Import terminated successfully with warnings.
生产上面出现的错误在这里就得到复现了。而且是在导入"T_PAR":"P02"出现的错误,这个正好印证了前面的观点。
三、解决办法
解决办法有以下两种(任一即可):
a. 使用exp导出的时候不要加direct=true
b. 设置数据库的参数deferred_segment_creation为false(注意:这个参数只影响新建的分区表,老的分区表导出再导入仍然会报错!)
四、有时间、有兴趣的读者可以接着做实验
可能大家会问,你怎么知道是分区表的问题,又怎么知道是direct=true的问题,又怎么知道是参数deferred_segment_creation的问题?接下来我一一验证。
1. 清空jerry的表,导出tom用户下表t_normal,t_norows,再导入到jerry用户中
SQL> drop user jerry cascade; // 通过重建jerry用户来清空jerry的表
SQL> create user jerry identified by jerry;
SQL> grant dba to jerry;
exp tom/tom file=tom.dmp log=tom_exp.log direct=true tables=t_normal,t_norows
导出日志:
. . exporting table T_NORMAL 14 rows exported
. . exporting table T_NOROWS 0 rows exported
Export terminated successfully without warnings.
imp jerry/jerry file=tom.dmp log=jerry_imp.log fromuser=tom touser=jerry
导入日志:
. . importing table "T_NORMAL" 14 rows imported
. . importing table "T_NOROWS" 0 rows imported
Import terminated successfully without warnings.
可以看到对这两张表导入是没有问题的
2. 清空jerry的表,导出tom用户下表t_par,再导入到jerry用户中
清空jerry的表的操作请看上面的步骤
exp tom/tom file=tom.dmp log=tom_exp.log direct=true tables=t_par
导出日志:
. . exporting table T_PAR
. . exporting partition P01 1 rows exported
. . exporting partition P02 0 rows exported
Export terminated successfully without warnings.imp jerry/jerry file=tom.dmp log=jerry_imp.log fromuser=tom touser=jerry
导入日志:
. importing TOM's objects into JERRY
. . importing partition "T_PAR":"P01" 1 rows imported
. . importing partition "T_PAR":"P02"
IMP-00009: abnormal end of export file
Import terminated successfully with warnings.
可以看到问题就出在对这张分区表的导入上面了
3. 清空jerry的表,重新导出tom用户下表t_par,再导入到jerry用户中(这次导出不加参数direct=true)
清空jerry的表的操作请看上面的步骤
exp tom/tom file=tom.dmp log=tom_exp.log tables=t_par
导出日志:
. . exporting table T_PAR
. . exporting partition P01 1 rows exported
. . exporting partition P02 0 rows exported
Export terminated successfully without warnings.imp jerry/jerry file=tom.dmp log=jerry_imp.log fromuser=tom touser=jerry
导入日志:
. importing TOM's objects into JERRY
. . importing partition "T_PAR":"P01" 1 rows imported
. . importing partition "T_PAR":"P02" 0 rows imported
Import terminated successfully without warnings.
可以看到这次导入没有任何问题,也就是说不加direct=true直接可以解决问题,但是如果我非要加这个参数呢,或者说这个命令写死到程序中了,没办法改怎么办?处理办法看下面第6条。
4. 清空jerry的表,在tom.t_par的p02分区中插入一条数据,重新导出tom用户下表t_par,再导入到jerry用户中(这次导出依然加参数direct=true)
清空jerry的表的操作请看上面的步骤
SQL> insert into tom.t_par values(2, 'bb'); // 往分区p02插入一条数据
--结束END--
本文标题: IMP-00009:异常结束导出文件解决方案
本文链接: https://lsjlt.com/news/46272.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0