PostgreSQL 12 Autovacuum停止运行,如何排查原因?
PostgreSQL 12 Autovacuum停止运行的排查步骤
一、检查Autovacuum进程状态
- 查看系统中是否存在autovacuum worker进程:
ps aux | grep autovacuum - 查询数据库内的autovacuum相关进程,确认是否有阻塞或异常:
重点关注SELECT pid, datname, query, state, wait_event_type, wait_event, now() - query_start AS duration FROM pg_stat_activity WHERE query LIKE '%autovacuum%';wait_event_type和wait_event字段,判断是否存在锁等待或资源争抢。
二、检查数据库/表级的Autovacuum禁用配置
- 检查数据库级是否禁用了autovacuum:
查看SELECT datname, datconfig FROM pg_database;datconfig列是否包含autovacuum=off。 - 检查目标表是否被禁用autovacuum:
确认SELECT relname, reloptions FROM pg_class WHERE relname = 'ods_storage_sync_queue';reloptions中没有autovacuum_enabled=false或vacuum_enabled=false。
三、查看PostgreSQL日志
- 检查数据库日志文件,搜索
autovacuum相关的错误、警告或崩溃信息,例如:- 权限不足导致无法访问表
- WAL目录磁盘空间不足
- Autovacuum进程被OOM killer终止
- 若日志信息不足,可临时调整日志级别(生产环境需谨慎操作,事后恢复):
ALTER SYSTEM SET log_min_messages = warning; ALTER SYSTEM SET log_statement = 'ddl'; SELECT pg_reload_conf();
四、检查系统资源限制
- 检查内存使用及OOM日志:
确认是否因系统内存不足,autovacuum进程被OOM killer终止。free -h dmesg | grep -i oom - 检查磁盘空间:
重点关注df -hpg_wal(v12中)和数据存储目录的剩余空间,磁盘满会导致autovacuum无法执行。 - 检查CPU负载:
若系统CPU长期处于高负载,可能导致autovacuum进程无法被调度。top
五、排查表锁与长事务
- 检查目标表是否存在排他锁,阻塞autovacuum:
SELECT l.pid, l.mode, a.datname, a.query FROM pg_locks l JOIN pg_stat_activity a ON l.pid = a.pid WHERE l.relation = (SELECT oid FROM pg_class WHERE relname = 'ods_storage_sync_queue') AND l.mode = 'AccessExclusiveLock'; - 检查是否存在长时间未结束的事务,这类事务会阻止autovacuum清理死元组:
SELECT pid, datname, query, now() - query_start AS duration FROM pg_stat_activity WHERE state = 'idle in transaction' AND duration > '1 hour';
六、验证Autovacuum参数的实际生效值
- 查询当前生效的autovacuum相关参数,确认是否被动态修改:
重点关注SELECT name, setting, source FROM pg_settings WHERE name LIKE 'autovacuum%';autovacuum参数的source是否为configuration file,避免被会话级或全局级临时修改。
七、更新表统计信息
- 若
pg_stat_user_tables中的统计数据过时,会导致autovacuum判断错误,手动更新统计:ANALYZE ods_storage_sync_queue; - 重新查询统计数据,确认死元组计数是否准确:
SELECT relname, n_dead_tup, n_live_tup, last_autovacuum FROM pg_stat_user_tables WHERE relname = 'ods_storage_sync_queue';
八、检查版本已知Bug
- 查阅PostgreSQL 12的官方Release Notes,确认是否存在导致autovacuum停止的已知Bug,例如worker进程崩溃后无法重启、调度逻辑异常等,必要时升级到对应版本的最新补丁。
内容的提问来源于stack exchange,提问作者xpg934
相关产品推荐
相关产品推荐

