返回顶部
首页 > 资讯 > 数据库 >IMP-00009:异常结束导出文件解决方案
  • 552
分享到

IMP-00009:异常结束导出文件解决方案

2024-04-02 19:04:59 552人浏览 薄情痞子
摘要

原文: 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

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作