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

标签 postgresql database-deadlocks postgresql-9.5 vacuum

如何在 PostgreSQL 9.5 中找到导致死锁错误/失败的原因,当使用选项 --jobs 对数据库执行完全 vacuumdb 以并行运行完全真空时。

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

最佳答案

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

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

  • 锁定对清理过的表的访问。不过,不确定获取一些独占锁是否有帮助。您可能需要在应用程序级别阻止对表的访问。
  • 使用创建新表 - 交换(重命名表) - 移动数据 - 删除原始技术。这样您就不会在原始表下收缩空间,只需删除表即可释放它。当然,您正在重建所有索引、重定向 FK 等。

另一个问题是:你需要VACUUM FULL吗? VACUUM ANALYZE 做的唯一一件事是压缩文件系统上的表。如果您不是很受磁盘空间的限制,则不需要进行那么多的完全清理。

希望对您有所帮助。

关于PostgreSQL 如何在使用 --jobs 参数时查找导致真空死锁的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39440460/

相关文章:

postgresql - 在 SQL 查询中使用临时数据

postgresql - 不运行 PostgreSQL 的异常

c# - 更新存储过程中的死锁

database - 什么是数据库中的死锁?

php - 我的 MySQL 死锁场景——需要建议

sql - 如何获取 postgresql 9.5 中特定模式中存在的所有表的表行数?

json - PostgreSQL 9.5 - 将 NULL 与 JSON 合并时更新不起作用

java - 值 'CONTINUE' 不是运行 liquibase 时的 facet-valid 错误

postgresql - 如何找到消耗最多 I/O 的 postgresql 查询

database - 数据库表之间的关系