You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL+Prometheus存储适配器:pg_stat_database指标全零求助

问题排查思路:pg_stat_database 统计值为 0 但存在数据库操作

我之前碰到过类似的情况,结合 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:18:27