PostgreSQL失败的导入仍然声称硬盘空间?需要清除缓存吗?

时间:2017-11-08 16:03:38

标签: database postgresql csv caching storage

我有一个PostgreSQL(OS X上的10.0)数据库,目前只有一个表。当我在该表中导入csv文件时,我注意到了一些奇怪的东西。

当导入因各种原因失败时(例如csv文件中的一行额外行或给定行的列中的字符太多),表中没有添加任何行,但PostgreSQL仍声称我的硬盘上有空格

现在,我有一个非常大的csv导入,它失败了几次因为csv不符合开始 - 所以我有很多导入失败,我修复并尝试再次导入。我现在意识到我的计算机存储空间已经减少了30-50 GB左右,因此我的数据库仍然是空的。

  • 这是正常的吗?
  • 我怀疑这是我数据库缓存中的某个地方。有没有办法让我清除缓存或者是否必须完全重新安装我的数据库?

谢谢!

1 个答案:

答案 0 :(得分:1)

将行插入数据库会增加表的大小。

即使COPY语句失败,到目前为止已插入的行仍保留在表中,但它们是死行,因为插入它们的事务失败。

在PostgreSQL中,SQL语句VACUUM将释放该空间。这通常不会缩小表格,但它会使空间可用于将来的插入。

通常,这是由 autovacuum守护程序在后台自动完成的。

有几种可能性:

  • 您已停用autovacuum。

  • Autovacuum对表的清理速度不够快,因此下一次加载无法重复使用空间。

你能做什么:

  • 在表格上运行VACUUM (VERBOSE)以手动删除死行。

  • 如果要减小表格大小,请在表格中运行VACUUM (FULL)。这将在操作期间锁定表格。