首页 > 解决方案 > Azure 托管 PostgreSQL 服务上的中断 VACUUM FULL 消耗了大量空间。我该如何恢复它?

问题描述

如果您托管自己的服务器,我遇到了一个已知解决方案的问题,但我不知道如何在 Azure 托管的 PostgreSQL 数据库实例上解决。

我在 Azure 托管的 PostgreSQL 数据库实例上执行 VACUUM FULL。数据库中的绝大多数数据都在一张大表中。

数据库实例有 250GB 分配给它。在真空期间,我跟踪了 Azure 上的服务器指标,可以看到空间使用率从可用空间的 30% 左右增长到可用空间的 60% 左右。然而,此时服务器似乎挂起。指标停止报告数据(好像服务器完全空闲),我无法联系它。

我在 Azure 上重新启动数据库实例并再次执行 VACUUM FULL。这次在 VACUUM 期间,空间使用率从 60% 增长到几乎 90%,但 VACUUM 顺利完成,整体使用率下降到略低于 60%。

服务器的性能现在很好,但即使自从我开始第一次清理之后没有向它添加任何数据,消耗的空间量也大约翻了一番。由于最初的真空失败,我损失了大约 80GB 的空间。

通过在网上搜索,我发现这种情况可能是由于真空创建的临时文件由于真空中断而没有正确删除。如果我运行自己的服务器,这很容易,但我不知道如何在托管服务器上取回空间。

是否有已知的程序来解决这个问题(除了导出数据和重新创建实例?)

标签: postgresqlazureazure-database-postgresql

解决方案


好像您在VACUUM (FULL). 这在数据目录中产生了一些您无法摆脱的“孤立”文件。

如果您无法访问文件系统,则无法回收该空间,即使访问也很困难且危险(手动修改数据目录有风险且不受支持)。

我能想到的唯一补救措施是创建一个新数据库并使用pg_dump/复制您的数据库pg_restore

下次,取消VACUUM而不是使服务器崩溃。那会清理垃圾。


推荐阅读