ITPub博客

首页 > Linux操作系统 > Linux操作系统 > EXP导出外部表报错(二)

EXP导出外部表报错(二)

原创 Linux操作系统 作者:yangtingkun 时间:2009-01-31 22:02:40 0 删除 编辑

今天测试的时候发现在10201环境中,利用EXP导出外部表报错。

这里继续寻找导致错误的原因。

EXP导出外部表报错(一):http://yangtingkun.itpub.net/post/468/477637

 

 

上面一篇文章描述了错误现象,并且初步怀疑和外部表对应的数据文件不存在有关,这里继续寻找导致问题的原因。

下面新创建一个外部表,利用外部表卸载数据的功能,生成数据文件:

SQL> CREATE TABLE T_EXTERNAL2
  2  (
  3   ID,
  4   NAME
  5  )
  6  ORGANIZATION EXTERNAL
  7  (
  8   TYPE ORACLE_DATAPUMP
  9   DEFAULT DIRECTORY D_OUTPUT
 10   LOCATION ('TEST2.DMP')
 11  )
 12  AS SELECT ROWNUM, TNAME FROM TAB
 13  ;

表已创建。

SQL> SELECT * FROM T_EXTERNAL2 WHERE ROWNUM < 5;

        ID NAME
---------- ------------------------------
         1 T_PARTITION
         2 T_PART
         3 CHAINED_ROWS
         4 T_NO_EXISTS_BEFORE

尝试利用EXP工具导出这张表:

E:\>exp yangtk/yangtk file=t_external2.dmp tables=t_external2

Export: Release 10.2.0.1.0 - Production on 星期五 1 30 20:15:34 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即将导出指定的表通过常规路径...
. .
正在导出表                     T_EXTERNAL2
EXP-00002:
写入导出文件时出错
EXP-00056:
遇到 ORACLE 错误 1403
ORA-01403:
未找到数据
EXP-00002:
写入导出文件时出错
EXP-00000:
导出终止失败

看来问题和表对应的数据文件是否存在没有关系。

尝试使用DIRECT=Y的方式导出:

E:\>exp yangtk/yangtk file=t_external2.dmp tables=t_external2 direct=y

Export: Release 10.2.0.1.0 - Production on 星期五 1 30 20:24:09 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即将导出指定的表通过直接路径...
. .
正在导出表                     T_EXTERNAL2
EXP-00002:
写入导出文件时出错
EXP-00056:
遇到 ORACLE 错误 1403
ORA-01403:
未找到数据
EXP-00002:
写入导出文件时出错
EXP-00000:
导出终止失败

错误仍然出现,看来问题和直接路径于常规路径无关。

下面再来看看问题是否和外部表的数据泵类型驱动有关。

execute.sql文件中编辑SQL如下:

SELECT '"' || ROWNUM || '","' ||
 A.TNAME || '"'
FROM TAB A
;

运行call.sql,得到用于外部表加载的数据文件:

SQL> @D:\WORK\EXECUTE\CALL.SQL E:\DMP\T_EXTER.DAT

关于execute.sqlcall.sql的说明可以参考:http://yangtingkun.itpub.net/post/468/31622

检查一下获取的数据文件:

E:\>type e:\dmp\t_exter.dat
"1","T_PARTITION"
"2","T_PART"
"3","CHAINED_ROWS"
"4","T_NO_EXISTS_BEFORE"
"5","T_CHAR"
"6","T_LOAD_SPACE"
"7","T_LEVEL"
"8","T_LEVEL1"
"9","T_TREE"
"10","T_RECORD"
"11","T_EXTERNAL"
"12","T_YANGTK"
"13","T_FUNCTION"
"14","T_TAB"
"15","T_SESSION_STAT"
"16","T_TEMP2"
"17","SYS_EXPORT_SCHEMA_01"
"18","MV_T"
"19","T_INDEX_ORG"
"20","T_PART_RANGE"
"21","C_TEST"
"22","T_C_1"
"23","T_C_2"
"24","T_255"
"25","T_256"
"26","T_NUM"
"27","MV_T_NUM"
"28","C_HASH"
"29","T_HASH"
"30","TEST"
"31","T"
"32","T_PART_INDEX"
"33","RUPD$_MV_T"
"34","MLOG$_MV_T"
"35","T_EXTERNAL2"

E:\>

下面建立一个ORACLE_LOADER类型的外部表:

SQL> CREATE TABLE T_EXTERNAL_LOADER
  2  (
  3   ID NUMBER,
  4   NAME VARCHAR2(30)
  5  )
  6  ORGANIZATION EXTERNAL
  7  (
  8   TYPE ORACLE_LOADER
  9   DEFAULT DIRECTORY D_OUTPUT
 10   ACCESS PARAMETERS (FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"')
 11   LOCATION ('T_EXTER.DAT')
 12  );

表已创建。

SQL> SELECT * FROM T_EXTERNAL_LOADER
  2  WHERE ROWNUM < 5;

        ID NAME
---------- ------------------------------
         1 T_PARTITION
         2 T_PART
         3 CHAINED_ROWS
         4 T_NO_EXISTS_BEFORE

下面再次尝试EXP导出:

E:\>exp yangtk/yangtk file=t_external_loader.dmp tables=t_external_loader

Export: Release 10.2.0.1.0 - Production on 星期六 1 31 17:04:52 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即将导出指定的表通过常规路径...
. .
正在导出表               T_EXTERNAL_LOADER
成功终止导出, 没有出现警告。

导出操作成功完成,下面手工删除外部表读取的数据文件:

E:\>del e:\dmp\t_exter.dat

SQLPLUS中查询外部表:

SQL> SELECT * FROM T_EXTERNAL_LOADER
  2  WHERE ROWNUM < 5;
SELECT * FROM T_EXTERNAL_LOADER
*
1 行出现错误:
ORA-29913:
执行 ODCIEXTTABLEOPEN 调出时出错
ORA-29400:
数据插件错误KUP-04040: file T_EXTER.DAT in D_OUTPUT not found
ORA-06512:
"SYS.ORACLE_LOADER", line 19

读取报错,再来看看EXP的结果会如何:

E:\>exp yangtk/yangtk file=t_external_loader.dmp tables=t_external_loader

Export: Release 10.2.0.1.0 - Production on 星期六 1 31 17:07:09 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即将导出指定的表通过常规路径...
. .
正在导出表               T_EXTERNAL_LOADER
成功终止导出, 没有出现警告。

导出依然可以成功,通过检查导出的文件也可以看到,Oracleexp在导出外部表的时候,并不会导出数据,而只是导入外部表的结构。

那么现在问题就比较明显了。由于ORACLE_DATAPUMP类型的外部表是10g新增的功能,EXP还没有和这个功能磨合好,导致了这个bug的产生。而数据泵则不同,数据泵利用的就是DBMS_DATAPUMP的功能,因此和ORACLE_DATAPUMP类型的外部表可以配合的很好。

 

 

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

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10468037