PostgreSQL 10.21统计收集器无响应,查询随机变慢求非重启解决方案
解决方案:PostgreSQL 10.21 stats collector无响应导致查询变慢(无需重启)
临时缓解查询性能波动
- 手动生成最新统计信息:执行
ANALYZE VERBOSE;,直接绕过僵死的stats collector更新全库统计数据,让查询优化器拿到较新的统计值,避免因过时统计生成低效执行计划。如果不想全库分析,也可以针对慢查询涉及的单表执行ANALYZE <目标表名>;,减少对生产环境的影响。 - 临时禁用统计依赖(谨慎使用):如果查询变慢是因为优化器过度依赖 stale stats,可临时设置
SET enable_statistics = off;针对当前会话,让优化器使用默认估算值,但此方法可能导致部分查询更慢,仅应急使用。
修复stats collector未响应问题
- 唤醒僵死的stats collector进程:先通过
ps aux | grep postgres | grep stats找到stats collector的PID,然后发送SIGUSR1信号尝试唤醒:kill -SIGUSR1 <stats_collector_pid>,这个信号会触发进程重新读取配置并尝试恢复数据收集。 - 调整stats临时目录:如果stats_temp_directory所在磁盘满了,会直接导致进程卡住。先清理该目录下的临时文件(默认路径是
$PGDATA/pg_stat_tmp),或者动态切换到空间充足的目录:ALTER SYSTEM SET stats_temp_directory = '/path/to/space-available-dir'; SELECT pg_reload_conf(); - 降低stats收集负载:动态调小
stats_collection_target参数(默认100),减少stats collector需要处理的数据量,缓解压力:ALTER SYSTEM SET stats_collection_target = 50; SELECT pg_reload_conf(); - 检查系统资源瓶颈:用
iostat查看磁盘IO使用率,如果磁盘读写过高优先排查占用IO的进程;用free -m检查内存,避免因内存不足导致swap频繁拖垮stats collector。
长期预防
- 低峰时段定期执行
ANALYZE:添加crontab定时任务,在业务低峰期手动更新统计数据,降低对stats collector的依赖。 - 监控stats collector状态:编写脚本监控pg_log中的
using stale statistics日志,或者检查pg_stat_bgwriter中的stats相关指标,提前发现异常。
内容的提问来源于stack exchange,提问作者user3323627
相关产品推荐
相关产品推荐

