2015-02-24 73 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