在Linux上,我的远程系统上的文件太大而无法在本地系统上保存,因此我正在使用ssh将文件流式传输到本地系统,并使用Vertica的副本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。很难说这是否正是我所看到的。最近,我从管道的早期得到了错误:
awk: fatal: print to "standard output" failed (Connection reset by peer)
请注意,这不是Vertica问题。我想在提交之前解决Vertica是一个上游问题。例如,如果本应收到5000万条记录时,我仅收到3000万条记录,那么我想在提交不完整的数据之前回滚。知道我是否有不完整的数据也将是“有益的”,这是我现在不了解日志就不知道的事情。
我只是希望我有空间将数据流式传输到本地文件中,然后将文件加载到Vertica中,但由于数据量太大而不能。
谢谢您的输入。
答案 0 :(得分:0)
我这里有一些可以在小情况下工作的东西,但是我还没有尝试过大情况。基本上,我正在做的是创建一个命名管道,并在一个过程中将数据发送到该管道,同时在另一个过程中将该数据读入Vertica。数据写入完成后,我将“提交”或“回滚”保存到一个文件中,完成后将其批处理到Vertica中。 Vertica完成复制后,我将运行睡眠几秒钟以确保在运行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
我正在从Oracle过渡到Vertica。如果有人有更好的方法可以做到这一点,我很想听听。
我应该补充一点,出于测试目的,我一直在使用名为falseCat的脚本:
#!/bin/ksh
cat -
exit 141
这会将stdin回显到stdout,并产生与我从ssh获取的相同的141错误代码。