SQLLDR利用EXPRESSION生成LOGFILE的檔名導致SEGMENTATION FAULT

yangtingkun發表於2011-08-06

嘗試利用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:\study\yangtk\others,2006
年總結.doc
2,d:\study\yangtk\others,2007Oracle
開發者大會(一).doc
3,d:\study\yangtk\others,2007Oracle
開發者大會(二).doc
4,d:\study\yangtk\others,2007
年總結.doc
.
.
.
74,d:\study\yangtk\others,
問題診斷和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下特有的。

嘗試了Windows10.2.0.511.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的方式,同樣可以成功載入。

Oraclemetalink上找不到類似的問題,懷疑SQLLDR不支援EXPRESSION作為LOGFILE讀取的引數,不過不管如何,出現SEGMENTATION FAULT都是不應該的。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-704336/,如需轉載,請註明出處,否則將追究法律責任。

相關文章