2017-09-05 37 views
1

我正在一个项目,以使进程的摄入一个40GB的csv到一个Rails应用程序幂等使用Postgres表。如果摄入的工作人员失败了,应该重新运行工作人员,并且如果以前成功完成,摄入将在停止的地方回收,或者什么都不做。如何重试Postgres COPY错误后与大CSV

我已经解决了检索CSV文件idempotent,但我不确定的部分是关于PostgreSQL在COPY操作期间如何处理失败。

进口是常规的,类似于:

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

我能找到失败的最来源于doc

COPY在第一个错误停止操作。这不应该导致在COPY TO事件中出现问题,但目标表已经收到COPY FROM中的早期行。这些行将不可见或可访问,但它们仍占用磁盘空间。

是否有可能COPY失败,而插入一行会留下一些列中丢失或损坏的数据?

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

+1

你可能想要阅读更多关于http://pgloader.io/howto/pgloader.1.html,它有'--on-error-stop' –

回答

0

是否有可能COPY失败,而插入一行会留下一些列中丢失或损坏的数据?

不。它使用一些磁盘空间,当您向表中添加数据时会重新使用该磁盘空间,或者在表中添加数据时会被释放。但它在SQL级别以任何方式都不可见。

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

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

+0

感谢您的回答。 “或者使用外部装载机。”想到任何例子? – doremi

+1

pgloader可能是一种选择,也有很多ETL工具 –