墨墨导读:本文来自读者“小豹子加油(网名)”的投稿,主要讲述使用imp导入文件出现IMP-00009问题的处理过程。
云和恩墨大讲堂线上分享:《weblogic 优化》
时间:2019年7月30日(星期二)20:30-21:30
立即报名:https://cs.enmotech.com/event/57
一、概述
最近在测试环境的一个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
导出日志如下(省略部分无关内容):