如何在大CSV错误后重试Postgres COPY

时间:2017-09-05 00:12:43

标签: ruby-on-rails postgresql csv

我正在开发一个项目来完成将一个40GB的csv摄取到Rails应用程序幂等中使用的Postgres表中的过程。如果摄取工作者失败了,那么工作人员应该重新运行并且摄取将在它停止的地方重新开始,或者如果之前成功完成则不做任何操作。

我已经解决了使CSV文件的检索具有幂等性的问题,但我不确定的部分是关于Postgres在COPY操作期间如何处理故障。

导入是常规的,类似于:

copy my_table (id,col1, col2, etc) from 'large.csv' with (DELIMITER ',')

我发现的最多失败来自doc

  

COPY在第一个错误时停止操作。如果发生COPY TO,这不会导致问题,但目标表已经收到了COPY FROM中的早期行。这些行将不可见或无法访问,但它们仍会占用磁盘空间。

插入行时是否可能COPY失败会在某些列中丢失或损坏数据?

如果COPY命令在失败时通过40GB文件达到50%,那么在重试时插入剩余行的最有效方法是什么?

1 个答案:

答案 0 :(得分:0)

  

插入行时COPY是否可能会在某些列中丢失或损坏数据?

没有。它使用一些磁盘空间,在向表中添加数据时重复使用,或在表VACUUM FULL时释放。但它在SQL级别上看不到任何方式。

就SQL级别而言,COPY完全撤消。你无法恢复,因为没有什么可以恢复。事务回滚,所有复制的数据都被丢弃。

您希望使用保存点或临时提交批量COPY。或者使用外部装载机。