Linux 当上游错误发生时,如何从stdin回滚Vertica副本?

Linux 当上游错误发生时,如何从stdin回滚Vertica副本?,linux,ksh,vertica,Linux,Ksh,Vertica,在Linux上,远程系统上的文件太大,无法保存在本地系统上,因此我使用ssh将文件流式传输到本地系统,并使用Vertica的copy stdin输入数据。问题是,偶尔由于某种原因流媒体会失败,我将不完整的数据提交到Vertica 出于演示目的,我准备了以下内容: cat ./test.dat | falseCat | vsql -d SRVVERTICA -c "copy thisTable (a,b,c) FROM local stdin delimiter '|' trailing null

在Linux上,远程系统上的文件太大,无法保存在本地系统上,因此我使用ssh将文件流式传输到本地系统,并使用Vertica的copy stdin输入数据。问题是,偶尔由于某种原因流媒体会失败,我将不完整的数据提交到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,并始终向Vertica返回错误。很难说这是否正是我所看到的。最近,我在管道的前面得到了一个错误:

  awk: fatal: print to "standard output" failed (Connection reset by peer)
请注意,这不是Vertica的问题。这是一个上游问题,我正试图在Vertica出现之前抓住它。例如,如果我只收到3000万条记录,而我本应收到5000万条记录,那么我希望在提交不完整的数据之前回滚。如果能知道我是否得到了不完整的数据,这也会“有帮助”,因为如果不研究日志,我现在就不知道

我只是希望我有空间将数据流式传输到本地文件并将文件加载到Vertica中,但由于数据的大小,我不能


谢谢您的意见。

我这里有一些小案例可以使用,但我还没有尝试过大案例。基本上,我所做的是创建一个命名管道,并在一个进程中将数据发送到管道,同时在另一个进程中将数据读入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

这会将stdin回显到stdout,并产生与我从ssh获得的相同的141错误代码。

回滚是什么意思?副本是否插入任何行?或者只是处理异常并重试?我想插入,比如说,5000万个记录,但是管道在中间失败,所以VERICA只插入3000万个。如果管道出现故障,我想回滚,这样我就不会得到一个不完整的负载。我希望如果有人对这个问题有足够强烈的感觉,能够记下来,他们可以费心评论他们不喜欢的内容。我认为这是一个很有道理的问题,也许是老生常谈,但仍然有道理。我怎么知道在会议结束后你不能回头。在这种情况下,我可能会这样做:加载较小的部分,并在开始加载之前获取历元。如果部分失败,您可以回滚到新纪元(显然,如果多个进程并行加载,可能会出现问题)
#!/bin/ksh
cat -
exit 141