PostgreSQL+Prometheus存储适配器:pg_stat_database指标全零求助
我之前碰到过类似的情况,结合 PostgreSQL 的统计机制,给你几个具体的排查方向:
1. 确认统计数据是否被重置
PostgreSQL 的 pg_stat_database 统计是累积值,一旦执行过 SELECT pg_stat_reset();,所有统计值会被清零,之后需要等待新的操作触发统计更新。从你的查询结果看,stats_reset 字段为空,大概率是刚执行过重置操作,或者统计服务还没完成首次数据收集。你可以等待几分钟后再查询,看看数值是否有变化。
2. 检查核心统计参数是否开启
PostgreSQL 依赖 track_counts 参数来收集表和数据库的统计数据,默认是开启的,但如果被误关闭,所有统计值都会停留在 0。执行以下命令确认:
SHOW track_counts;
如果结果是 off,需要在 postgresql.conf 中修改为 track_counts = on,然后重启 PostgreSQL 服务。
3. 验证事务是否真的产生了数据变更
你看到的 COMMIT 语句不一定对应实际的数据写入操作——比如空事务(BEGIN; COMMIT;)或者没有实际修改数据的事务,不会触发 tup_inserted/tup_updated 等统计值的变化。可以通过以下方式验证:
- 查看
pg_stat_activity中这些COMMIT对应的前序语句(如果会话还没关闭) - 开启
pg_stat_statements扩展(如果没开启的话),通过查询pg_stat_statements查看最近执行的所有 SQL,确认是否有真实的INSERT/UPDATE/DELETE操作:SELECT query, calls, rows FROM pg_stat_statements WHERE query LIKE '%INSERT%' OR query LIKE '%UPDATE%' OR query LIKE '%DELETE%';
4. 查看单表级别的统计数据
pg_stat_database 是全局汇总的统计,如果某个表的统计没有更新,可能会导致全局值异常。可以查询具体表的统计来验证:
SELECT relname, n_live_tup, n_dead_tup, seq_scan, idx_scan, tup_inserted, tup_updated, tup_deleted FROM pg_stat_user_tables WHERE schemaname = 'public';
如果单表的统计值有变化,但 pg_stat_database 还是 0,那可能是统计汇总的延迟,或者 PostgreSQL 的统计收集进程出现了异常,可以尝试重启 PostgreSQL 服务。
5. 确认统计数据的刷新间隔
PostgreSQL 的统计收集进程(stats_collector)默认每隔 10 秒刷新一次统计数据,所以刚执行的操作不会立即反映到 pg_stat_database 中。你可以等待 10-30 秒后再次查询,或者修改 stats_temp_directory 等参数调整刷新频率(不建议生产环境随意修改)。
6. 检查 postgres_exporter 的权限与配置
虽然你自己查询 pg_stat_database 也得到 0,但还是要确认 exporter 使用的数据库用户是否有足够的权限查看统计数据。执行以下命令验证用户权限:
GRANT pg_monitor TO postgres_exporter;
另外,检查 exporter 的配置文件,确认是否有对查询结果进行过滤的规则,导致指标被隐藏。
内容的提问来源于stack exchange,提问作者Subash

