问题描述
如果您托管自己的服务器,我遇到了一个已知解决方案的问题,但我不知道如何在 Azure 托管的 PostgreSQL 数据库实例上解决。
我在 Azure 托管的 PostgreSQL 数据库实例上执行了 VACUUM FULL。数据库中的绝大多数数据都在一张大表中。
数据库实例有 250GB 分配给它。在清理期间,我跟踪了 Azure 上的服务器指标,可以看到空间使用量从可用空间的 30% 左右增长到可用空间的 60% 左右。然而,那时服务器似乎挂了。指标停止报告数据(好像服务器完全空闲),我无法联系它。
我在 Azure 上重新启动了数据库实例并再次执行了 VACUUM FULL。这一次在 VACUUM 期间,空间使用率从 60% 增长到近 90%,但 VACUUM 顺利完成,整体使用率下降到略低于 60%。
服务器的性能现在很好,但即使自从我开始第一次真空以来没有添加任何数据,消耗的空间量大约增加了一倍。由于最初的真空失败,我损失了大约 80GB 的空间。
从网上搜索我看到这种情况可能是由于真空创建的临时文件由于真空中断而未正确删除。如果我运行自己的服务器就足够简单了,但我不知道如何在托管服务器上获得空间。
是否有解决此问题的已知程序(除了导出数据并重新创建实例?)
解决方法
您似乎在 VACUUM (FULL)
中间崩溃了数据库服务器。这会在数据目录中产生一些您无法删除的“孤立”文件。
如果您无法访问文件系统,则无法回收该空间,即使访问也很困难且危险(手动修改数据目录有风险且不受支持)。
我能想到的唯一补救方法是创建一个新数据库并使用 pg_dump
/pg_restore
复制您的数据库。
下次,取消 VACUUM
而不是使服务器崩溃。那会清理垃圾。