在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。很难说这是否正是我所看到的。最近,我收到了之前管道中的错误:
awk: fatal: print to "standard output" failed (Connection reset by peer)
请注意,这不是Vertica问题。这是一个上游问题,我试图在它提交之前在Vertica中捕获。例如,如果我在收到5000万条记录时只收到3000万条记录,我想在提交不完整数据之前回滚。知道我是否有不完整的数据也是“有帮助的”,这是我现在不知道的,而不研究日志。
我只是希望我有空间将数据流式传输到本地文件并将文件加载到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
我正在从Oracle过渡到Vertica。如果有人有更好的方法,我很乐意听到它。
我应该添加它用于测试目的,我一直在使用一个名为falseCat的脚本:
#!/bin/ksh
cat -
exit 141
这将stdin与stdout相呼应,并生成与ssh相同的141错误代码。