如何在 PostgreSQL 9.5 中找到导致死锁错误/失败的原因,当使用选项 --jobs 对数据库执行完全 vacuumdb 以并行运行完全真空时。
我只是得到了一些进程号和表名...如何防止这种情况发生,以便我可以成功地对数据库进行并行完全清理?
最佳答案
在负载下完成 VACUUM FULL
是一项非常艰巨的任务。问题是 Postgres 正在收缩表占用的空间,因此任何数据操作都会干扰它。
要实现完全真空,您有以下选择:
- 锁定对清理过的表的访问。不过,不确定获取一些独占锁是否有帮助。您可能需要在应用程序级别阻止对表的访问。
- 使用
创建新表 - 交换(重命名表) - 移动数据 - 删除原始
技术。这样您就不会在原始表下收缩空间,只需删除表即可释放它。当然,您正在重建所有索引、重定向 FK 等。
另一个问题是:你需要VACUUM FULL
吗? VACUUM ANALYZE
做的唯一一件事是压缩文件系统上的表。如果您不是很受磁盘空间的限制,则不需要进行那么多的完全清理。
希望对您有所帮助。
关于PostgreSQL 如何在使用 --jobs 参数时查找导致真空死锁的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39440460/