Bil*_*ens 5 postgresql autovacuum
当 autovacuum 进程正在清理一个大表时,像 DROP 和 TRUNCATE 这样的查询会被阻塞直到清理完成吗?在文档中,它说
此外,标准形式的 VACUUM 可以与生产数据库操作并行运行。(诸如 SELECT、INSERT、UPDATE 和 DELETE 之类的命令将继续正常运行,尽管在清理表时您将无法使用诸如 ALTER TABLE 之类的命令来修改表的定义。)
但我想知道是否包括 DROP 或 TRUNCATE。
Autovacuum 和 VACUUM 的行为不同。它们确实获得了相同的锁,但是如果检测到 autovacuum 阻塞了其他东西,它就会被取消。DROP 或 TRUNCATE 将被阻止,但在 autovacuum 的情况下,它最多只能持续 1 秒(或任何“deadlock_timeout”设置为)。
一个例外是自动真空“以防止环绕”。这些不会被取消,这可能是一个主要问题。特别是在 DROP 或 TRUNCATE 的情况下,因为允许这些发生将首先消除对环绕真空的需要。
(对于技术细节的爱好者:锁定模式在src/backend/commands/vacuum.c的第1590行设置,它不依赖于auto或manual(在12dev HEAD上)。取消在src/backend/中完成storage/lmgr/proc.c 基于 src/backend/storage/lmgr/deadlock.c 中设置的标志。在那里完成是因为检查死锁的代码是检查是否被 autovac 阻塞的方便位置。)