2015-02-24 81 views
0

我正在使用外殼腳本從'extr'表中提取數據。 extr table是一個有410列的非常大的桌子。該表有61047行數據。一個記錄的大小約爲5KB。在假脫機文件列中移位

我的腳本如下:

#!/usr/bin/ksh 

sqlplus -s \/ << rbb 
set pages 0 
set head on 
set feed off 
set num 20 
set linesize 32767 
set colsep | 
set trimspool on 
spool extr.csv 
select * from extr; 
/
spool off 
rbb 
#-------- END --------- 

一個細一天extr.csv文件具有2個記錄用不正確的列數(即,一個記錄有更多的列數和其他具有較少)。經調查,我知道這兩個重複的記錄在文件中重複。記錄的主鍵理想情況下應該是唯一的文件,但在這種情況下,重複2條記錄。另外,列中的轉變是突然的。 輸出文件的小例子:

5001|A1A|AAB|190.00|105|A 
5002|A2A|ABB|180.00|200|F 
5003|A3A|AAB|153.33|205|R 
5004|A4A|ABB|261.50|269|F 
5005|A5A|AAB|243.00|258|G 
5006|A6A|ABB|147.89|154|H 
5003|A7A|AAB|249.67|AAB|153.33|205|R 
5004|A8A|269|F 
5009|A9A|AAB|368.00|358|S 
5010|AAA|ABB|245.71|215|F 

這裏是5003和5004的主鍵記錄到位的5007和5008已經再次出現同樣的重複reciords已通過追加/削減轉移的5007和5008記錄他們的專欄。

需要你的幫助來分析爲什麼會發生這種情況?爲什麼2行被多次提取?爲什麼其他2行從文件中丟失?爲什麼記錄被轉移? 注意:該腳本自過去兩年以來一直運行良好,除了一次(以上提到)以外從未失敗。它在下次運行中成功運行。最近我們又添加了一個用光標訪問extr表的程序(僅供選擇)。

+0

有人在第一次使用相同的輸出文件運行時啓動腳本嗎? extr.csv分區是否已滿?什麼東西重新啓動?環境中發生了什麼奇怪的事情? – 2015-02-27 21:22:07

+0

在這種情況下,5個腳本由包裝腳本並行運行。所有的腳本都在後臺觸發,包裝器等待所有腳本完成。3個是使用'select'查詢提取數據的shell腳本,其餘2個是COBOL程序。一個COBOL程序通過聲明一個遊標來從'extr'中讀取數據。包裝腳本使用TWS調度程序進行調度。沒有其他腳本與包裝並行運行。文件系統中有足夠的可用空間。什麼都沒有重新啓動。事件發生當天環境很正常,沒有什麼奇怪的報道。 – Sandy 2015-03-02 07:34:41

+0

嗨@WalterA您能否根據我的回答提供一些意見? – Sandy 2015-03-14 07:50:25

回答

0

我轉載了類似的行爲。

;-> cat input 
5001|A1A|AAB|190.00|105|A          
5002|A2A|ABB|180.00|200|F          
5003|A3A|AAB|153.33|205|R          
5004|A4A|ABB|261.50|269|F          
5005|A5A|AAB|243.00|258|G          
5006|A6A|ABB|147.89|154|H          
5009|A9A|AAB|368.00|358|S          
5010|AAA|ABB|245.71|215|F          

查看輸入文件作爲您的數據庫。
現在我寫一個腳本訪問「數據庫」並顯示一些隨機凍結。

;-> cat writeout.sh 
# Start this script twice          
while IFS=\| read a b c d e f; do 
     # I think you need \c for skipping \n, but I do it different one time 
     echo "$a|$b|$c|$d|" | tr -d "\n" 
     ((sleeptime = RANDOM % 5)) 
     sleep ${sleeptime} 
     echo "$e|$f" 
done <input>> output 

編輯:在上面的腳本刪除cat input |,通過< input

開始這個腳本在後臺換過兩次

;-> ./writeout.sh & 
;-> ./writeout.sh & 

等待兩個作業完成,然後查看結果

;-> cat output 
5001|A1A|AAB|190.00|105|A 
5002|A2A|ABB|180.00|200|F 
5003|A3A|AAB|153.33|5001|A1A|AAB|190.00|105|A 
5002|A2A|ABB|180.00|205|R 
5004|A4A|ABB|261.50|269|F 
5005|A5A|AAB|243.00|200|F 
5003|A3A|AAB|153.33|258|G 
5006|A6A|ABB|147.89|154|H 
5009|A9A|AAB|368.00|358|S 
5010|AAA|ABB|245.71|205|R 
5004|A4A|ABB|261.50|269|F 
5005|A5A|AAB|243.00|258|G 
5006|A6A|ABB|147.89|215|F 
154|H 
5009|A9A|AAB|368.00|358|S 
5010|AAA|ABB|245.71|215|F 

當我編輯最後一行令狀eout.sh到done > output我沒有看到問題,但這可能是由於緩衝和少量的數據。

我仍然不知道你的情況到底發生了什麼,但它確實看起來像2 progs同時寫入同一個腳本。
TWS中的作業可能已經手動重新啓動,您masterscript中的兩個腳本可能會寫入相同的文件或其他內容。
將來可以使用一些鎖定/檢查(當輸出文件存在時退出並將錯誤代碼返回給TWS)來完成。

+0

謝謝@Walter。沒有進程同時寫入輸出文件。我的感受是;在寫入AIX文件系統時,sqlplus可能面臨不一致的緩衝/鎖定/管道中斷問題。 – Sandy 2015-03-16 14:40:20