首页 > Linux操作系统 > Linux操作系统 > EXP导出外部表报错(二)
今天测试的时候发现在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.sql和call.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
成功终止导出, 没有出现警告。
导出依然可以成功,通过检查导出的文件也可以看到,Oracle的exp在导出外部表的时候,并不会导出数据,而只是导入外部表的结构。
那么现在问题就比较明显了。由于ORACLE_DATAPUMP类型的外部表是10g新增的功能,EXP还没有和这个功能磨合好,导致了这个bug的产生。而数据泵则不同,数据泵利用的就是DBMS_DATAPUMP的功能,因此和ORACLE_DATAPUMP类型的外部表可以配合的很好。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-544904/ ,如需转载,请注明出处,否则将追究法律责任。