我有一个问题,我的数据库中的一些大表似乎没有被 autovacuum 守护进程清空。这是我所看到的:
SELECT schemaname, relname, n_live_tup, n_dead_tup, last_autovacuum
FROM pg_stat_all_tables
ORDER BY n_dead_tup DESC LIMIT 5;
+------------+-----------------------------+------------+------------+-------------------------------+
| schemaname | relname | n_live_tup | n_dead_tup | last_autovacuum |
+------------+-----------------------------+------------+------------+-------------------------------+
| md | calculation_log_item | 35989527 | 3559253 | 2020-07-13 03:41:37.49764-04 |
| audit | transaction_statement | 700356 | 557278 | NULL |
| audit | record_history | 701635 | 438849 | NULL |
| md | program_requirement_state | 193500 | 29204 | 2020-07-14 03:06:02.339032-04 |
| md | calculation_log | 157942 | 11792 | NULL |
+------------+-----------------------------+------------+------------+-------------------------------+
(5 rows)
因此,很明显守护程序正在运行,因为昨晚有值(注意:我在 2020-07-14 发布此消息)。但是,我无法弄清楚为什么 transaction_statement 和 record_history 不是。与活的相比,它们有很多 dead_tuples。
我正在使用 PostgreSQL v11。以下是完整版本信息:
select version();
+---------------------------------------------------------------------------------------------------------------------------------+
| version |
+---------------------------------------------------------------------------------------------------------------------------------+
| PostgreSQL 11.8 (Ubuntu 11.8-1.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit |
+---------------------------------------------------------------------------------------------------------------------------------+
(1 row)
这可能是什么原因造成的?如果您认为我的问题含糊不清或需要其他信息来回答(例如 postgresql.conf 设置等),请添加评论。
autovacuum 不清理表可能有几个原因:
表存储参数配置与默认值不同:
enable_autovacuum = off
,autovacuum_vacuum_scale_factor
高得离谱或相似。\d+
通过查看中表的输出来找出答案psql
。桌子上的变化率如此之高,以至于 autovacuum 无法跟上。
如果您发现 autovacuum 工作人员正在为永远不会完成的表运行,就会出现这种情况。补救措施是降低
autovacuum_vacuum_cost_delay
。表或其索引中的数据损坏使 autovacuum 失败并出现错误,因此它永远不会完成对表的处理。查看日志文件以进行诊断。