我正在做一个项目,使40gbcsv摄取到一个Postgres表中的过程在Rails应用程序中是等幂的。如果摄取工作进程失败,则应重新运行该工作进程,并且摄取将恢复到它停止的位置,或者如果先前已成功完成,则不执行任何操作。
我已经讨论过让CSV文件的检索具有等幂性,但我不确定的是Postgres如何处理COPY操作期间的故障。
导入是例行的,类似于:

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

我能找到的关于失败的大部分信息来自于:
复制在第一个错误时停止操作。在复制到的情况下,这不应导致问题,但目标表将已经从中接收到先前的行。这些行将不可见或不可访问,但它们仍占用磁盘空间。
插入行时发生COPY故障是否会在某些列中留下丢失或损坏的数据?
如果COPY命令在失败时通过40GB文件达到50%,那么在重试时插入其余行的最有效方法是什么?

最佳答案

插入行时的复制失败是否会在某些列中留下丢失或损坏的数据?
不需要。它使用一些磁盘空间,在向表中添加数据时会重新使用,或者在VACUUM FULL表时释放。但是它在SQL级别是不可见的。
就SQL级别而言,COPY是完全撤消的。你不能继续,因为没有什么可以继续。事务回滚,所有复制的数据都被丢弃。
您需要使用保存点或临时提交来成批COPY。或者使用外部加载程序。

关于ruby-on-rails - 大CSV错误后如何重试Postgres COPY,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46045335/

10-10 05:37
查看更多