我犯了一个小错误,我的 VACUUM FULL 最终填满了实例的磁盘。我设法释放了足够的空间来重新启动 postgres,但恐怕不足以运行 VACUUM FULL 完成。
有没有办法释放失败的 VACUUM FULL 运行使用的空间?
PS:这是我使用的选项VACUUM (FULL, VERBOSE, ANALYZE, INDEX_CLEANUP)
我犯了一个小错误,我的 VACUUM FULL 最终填满了实例的磁盘。我设法释放了足够的空间来重新启动 postgres,但恐怕不足以运行 VACUUM FULL 完成。
有没有办法释放失败的 VACUUM FULL 运行使用的空间?
PS:这是我使用的选项VACUUM (FULL, VERBOSE, ANALYZE, INDEX_CLEANUP)
如果
VACUUM (FULL)
失败,它所填充的所有磁盘空间将被释放。该规则的例外情况是服务器在
VACUUM (FULL)
运行时崩溃(如果磁盘空间不足,可能会发生这种情况)。在崩溃(和崩溃恢复)之后,孤立的文件可能会留在磁盘上。没有简单的方法可以删除这些文件,而且您当然不能通过 SQL 来完成。如果您非常了解 PostgreSQL,您可能能够确定哪些文件可以安全删除,但如果您删除了错误的文件,您将面临最终损坏数据库的风险。
我知道的唯一安全的方法是:
pg_dump
数据库删除数据库并再次创建它(空)
从第一步恢复转储
劳伦兹所说的。
但是,引用手册:
这意味着,如果您
VACUUM FULL
以超级用户身份发布,共享对象也可能会受到影响,您需要转储和恢复整个集群以确保:(pg_dumpall
)。(不过,通常情况下,大部分僵尸文件将位于受影响数据库的目录中。)TEMPLATE
我想直接基于受影响的数据库创建一个新数据库,这比完整的转储/恢复周期快得多。(当然需要足够的可用存储空间)。不幸的是,因为这只是复制数据库的物理文件,它会包括你试图摆脱的僵尸文件。请记住,您需要足够的可用空间来完成完整的
pg_dump
. 转储文件可以比数据库本身更大或更小。由于可用的免费存储存在问题,请考虑转储到不同的物理位置。