【问题标题】:How to retry Postgres COPY after error with large CSV如何在大型 CSV 出错后重试 Postgres COPY
【发布时间】:2017-09-05 00:12:43
【问题描述】:

我正在开展一个项目,以使将 40GB csv 摄取到 Rails 应用程序中使用的 Postgres 表中的过程具有幂等性。如果摄取 Worker 失败,则应重新运行该 Worker,并且摄取会从中断的地方重新开始,如果之前成功完成,则什么也不做。

我已经解决了使 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%,那么在重试时插入剩余行的最有效方法是什么?

【问题讨论】:

标签: ruby-on-rails postgresql csv


【解决方案1】:

插入行时复制失败是否会在某些列中留下丢失或损坏的数据?

没有。它使用一些磁盘空间,当您向表中添加数据时会重新使用这些空间,或者在您VACUUM FULL 表时释放这些空间。但它在 SQL 级别上是不可见的。

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

您需要使用保存点或临时提交分批COPY。或者使用外部加载器。

【讨论】:

  • 感谢您的回答。 “或者使用外部加载器。”有没有想到的例子?
  • pgloader 可能是一种选择,也有很多 ETL 工具
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 2018-02-20
  • 2020-01-23
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多