2015-02-24 6 views
0

Я использую сценарий оболочки для извлечения данных из таблицы «extr». Таблица extr - очень большая таблица, имеющая 410 столбцов. В таблице содержится 61047 строк данных. Размер одной записи составляет около 5 КБ.Смещение в столбцах файла спула

I сценарий выглядит следующим образом:

#!/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 строки отсутствовали в файле? Почему записи были сдвинуты? Примечание: этот скрипт работает отлично с последних двух лет и никогда не прерывался, за исключением одного раза (упомянутый выше). Он успешно работал во время следующего прогона. Недавно мы добавили еще одну программу, которая обращается к таблице extr с помощью курсора (только для выбора).

+0

Кто-нибудь запустил сценарий во время первого запуска с использованием того же выходного файла? Был ли раздел с extr.csv полным? Что-то перезапустилось? Что-нибудь странное произошло в окружающей среде? –

+0

В этом случае 5 скриптов запускаются параллельно скриптом-оболочкой. Все сценарии запускаются в фоновом режиме, и оболочка ждет, пока все не будет завершено.3 из 5 - это сценарии оболочки, которые извлекают данные, используя запрос «select», а остальные 2 - программы COBOL. Одна программа COBOL считывает данные из «extr», объявляя курсор на нем. Сценарий оболочки запланирован с использованием планировщика TWS. Никакой другой скрипт не запускался параллельно оболочке. В файловой системе было достаточно места. Ничего не было перезапущено. Окружающая среда была нормальной, и ничего странного не сообщалось в день происшествия. – Sandy

+0

Hi @WalterA Не могли бы вы предоставить некоторые материалы, основанные на моем ответе? – Sandy

ответ

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 

EDIT: Удалены 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 Я не вижу проблемы, но это может быть связано с буферизацией и небольшим количеством данных.

Я до сих пор не знаю точно, что произошло в вашем случае, но на самом деле это похоже на две проги, написанные одновременно на один и тот же сценарий.
Задание в TWS могло быть перезапущено вручную, 2 скрипта в вашем мастерском записи могут записываться в один файл или что-то еще.
Предотвращение этого в будущем может быть выполнено с помощью некоторых блокировок/проверок (когда выходной файл существует, завершите и верните код ошибки в TWS).

+0

Спасибо @Walter. Нет процессов, которые записываются в выходной файл одновременно. Что я чувствую; sqlplus, возможно, столкнулся с несогласованными проблемами буферизации/блокировки/нарушения труб при записи в файловую систему AIX. – Sandy