PostgreSQL 如何在使用 --jobs 参数时查找导致真空死锁的原因

PostgreSQL how to find what is causing Deadlock in vacuum when using --jobs parameter

如何在 PostgreSQL 9.5 中找到导致死锁的原因 error/failure 当使用选项 --jobs 对数据库进行完全 vacuumdb 并行 运行 完全真空时。

我只是得到了一些进程号和 table 名称...如何防止这种情况,以便我可以成功地对数据库进行并行完全清理?

在负载下完成 VACUUM FULL 是一项非常艰巨的任务。问题是 Postgres 正在收缩 table 采取的 space,因此任何数据操作都会干扰它。

要实现完全真空,您有以下选择:

  • 锁定对已清理的 table 的访问权限。不过,不确定获取一些独占锁是否有帮助。您可能需要在应用程序级别阻止对 table 的访问。
  • 使用create new table - swap (rename tables) - move data - drop original技巧。这样你就不会在原来的 table 下收缩 space,你只需删除 table 就可以释放它。当然你正在重建所有索引,重定向 FKs 等

另一个问题是:你需要VACUUM FULL吗?它唯一做的 VACUUM ANALYZE 没有做的事情是在文件系统上收缩 table。如果你不是很受磁盘限制 space 你不需要做那么多的 full vacuum。

希望对您有所帮助。