Как откатить копию Vertica со стандартного ввода при возникновении вышестоящей ошибки? - PullRequest
0 голосов
/ 30 августа 2018

В Linux у меня есть файлы в удаленной системе, которые слишком велики для моей локальной системы, поэтому я использую ssh для потоковой передачи файлов в локальную систему и использую stticin для копирования Vertica для ввода данных. Проблема в том, что иногда по какой-то причине происходит сбой потоковой передачи, и у меня есть неполные данные, переданные в Vertica.

Для демонстрации я подготовил следующее:

cat ./test.dat | falseCat |
vsql -d SRVVERTICA -c "copy thisTable (a,b,c)
FROM local stdin
delimiter '|'
trailing nullcols
abort on error commit;"

Это пакетирует данные из моего файла данных через мою программу falseCat, которая передает свои данные и всегда возвращает ошибку в Vertica. Трудно сказать, если это именно то, что я вижу. Совсем недавно я получил ошибку от ранее в трубе:

  awk: fatal: print to "standard output" failed (Connection reset by peer)

Обратите внимание, что это не проблема Vertica. Это проблема верхнего уровня, которую я пытаюсь уловить в Vertica до того, как она совершится Например, если я получу только 30 миллионов записей, когда я должен получить 50 миллионов, я хочу откатиться до того, как зафиксировать неполные данные. Также было бы «полезно» узнать, получил ли я неполные данные, чего я сейчас не знаю, не изучив журналы.

Хотелось бы, чтобы у меня было место для локальной передачи данных в файл и загрузки файла в Vertica, но я не могу из-за размера данных.

Спасибо за любой вклад.

1 Ответ

0 голосов
/ 03 сентября 2018

У меня есть кое-что, что работает в маленьких случаях, но я еще не пробовал с большими случаями. По сути, я занимаюсь созданием именованного канала и отправкой данных в канал в одном процессе, а чтение этих данных в Vertica в другом. После завершения записи данных я сохраняю «коммит» или «откат» в файл, который я буду пакетировать в Vertica, когда это будет сделано. После того, как Vertica завершит копирование, я запускаю sleep на несколько секунд, чтобы убедиться, что другой процесс выполняется перед запуском сценария finalVert. Я был на высоте, я бы заставил его ждать, пока файл не появится, но это только начало.

set -o pipefail
[[ -p dataToVert ]] || mkfifo dataToVert
(
if cat ./test.dat | falseCat > dataToVert
then
    echo "commit;" > finalVert.sql
else
    echo "rollback;" > finalVert.sql"
fi
) &
vsql -d SRVVERTICA -At << EOF
copy thisTable (a,b,c)
FROM local 'dataToVert'
delimiter '|'
trailing nullcols
abort on error no commit;
\o | xargs sleep
select 5;
\o
\i finalVert.sql
\q
EOF

Я перехожу на Vertica из Oracle. Если у кого-то есть лучший способ сделать это, я хотел бы услышать это.

Я должен добавить, что для целей тестирования я использовал скрипт falseCat:

#!/bin/ksh
cat -
exit 141

Это выводит stdin на стандартный вывод и выдает тот же 141 код ошибки, который я получаю от ssh.

...