尝试利用SQLLDR导入包含LOB的对象,当LOB文件的路径和名称在数据文件中分开保存,利用单独的字段通过EXPRESSION的方式来获得完整路径,并通过这个字段来加载LOB时,出现SEGMENTATION FAULT错误。
测试表结构如下:
SQL> DROP TABLE T_LOAD_LOB PURGE;
表已删除。
SQL> CREATE TABLE T_LOAD_LOB
2 (ID NUMBER PRIMARY KEY,
3 NAME VARCHAR2(80),
4 DIRECTORY VARCHAR2(25),
5 FULL_NAME VARCHAR2(100),
6 CREATE_DATE DATE,
7 CONTENTS BLOB);
表已创建。
控制文件如下:
LOAD DATA
INFILE *
INTO TABLE T_LOAD_LOB
FIELDS TERMINATED BY ','
(ID CHAR(255),
DIRECTORY CHAR(255),
NAME CHAR(255),
FULL_NAME EXPRESSION "DIRECTORY '' NAME",
CREATE_DATE SYSDATE,
CONTENTS LOBFILE(FULL_NAME) TERMINATED BY EOF)
BEGINDATA
1,d:studyyangtkothers,2006年总结.doc
2,d:studyyangtkothers,2007Oracle开发者大会(一).doc
3,d:studyyangtkothers,2007Oracle开发者大会(二).doc
4,d:studyyangtkothers,2007年总结.doc
.
.
.
74,d:studyyangtkothers,问题诊断和PLSQL方面.doc
执行导入过程:
D:TEMP>SQLLDR TEST/TEST CONTROL=SQLLDR_LOB2.CTL
SQL*Loader: Release 10.2.0.5.0 - Production on 星期六 8月 6 22:40:44 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
在windows环境下会弹出对话框,说明sqlldr.exe已停止工作。描述信息为:出现了一个问题,导致程序停止正常工作。如果有可用的解决方案,Windows将关闭程序并通知您。
对应的LOG文件为空,数据库告警日志文件中也没有任何记录。
开始以为是Windows环境的问题,尝试重启数据库,问题依旧。索性重启了Windows环境,发现问题依然,开始怀疑问题并不是Windows下特有的。
尝试了Windows下10.2.0.5和11.2.0.1环境的sqlldr,出现同样的错误。
于是修改控制文件,使之可以在Linux环境下运行:
[oracle@yans1 ~]$ vi sqlldr_lob.ctl
LOAD DATA
INFILE *
INTO TABLE T_LOAD_LOB
FIELDS TERMINATED BY ','
(ID CHAR(255),
DIRECTORY CHAR(255),
NAME CHAR(255),
FULL_NAME EXPRESSION ":DIRECTORY '/' :NAME",
CREATE_DATE SYSDATE,
CONTENTS LOBFILE(FULL_NAME) TERMINATED BY EOF)
BEGINDATA
1,/home/oracle,t_stat1.dp
2,/home/oracle,t_stat.dmp
3,/home/roacle,t_stat.dp
执行导入时,出现了SEGMENTATION FAULT的错误:
[oracle@yans1 ~]$ sqlldr test/test control=sqlldr_lob.ctl
SQL*Loader: Release 10.2.0.3.0 - Production on 星期六 8月 6 20:18:07 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Segmentation fault
可以看到,这个错误在各个版本中普遍存在,如果去掉LOB的加载,则不会存在任何的错误,而如果FULL_NAME是通过数据文件中读取而不是这种EXPRESSION的方式,同样可以成功加载。
Oracle的metalink上找不到类似的问题,怀疑SQLLDR不支持EXPRESSION作为LOGFILE读取的参数,不过不管如何,出现SEGMENTATION FAULT都是不应该的。
该贴被蜀山战纪编辑于2015-12-3 16:34:43