在 CentOS 上监控 PostgreSQL,可以从 系统资源、数据库内存/连接、SQL 性能、慢查询、日志 多个层面来做。下面给你一个从基础到进阶的完整方案。
ps -ef | grep postgres
netstat -an | grep 5432
或
ss -lntp | grep postgres
su - postgres
psql
常用 SQL:
-- 当前连接数
SELECT count(*) FROM pg_stat_activity;
-- 当前活跃连接
SELECT pid, usename, datname, state, query
FROM pg_stat_activity
WHERE state = 'active';
-- 查看慢查询
SELECT pid, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE (now() - query_start) > interval '5 seconds';
-- 表大小
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;
-- 索引使用率
SELECT * FROM pg_stat_user_indexes;
编辑配置文件:
vim /var/lib/pgsql/data/postgresql.conf
推荐配置:
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_min_duration_statement = 500 # 记录超过 500ms 的 SQL
log_connections = on
log_disconnections = on
重启 PostgreSQL:
systemctl restart postgresql
tail -f /var/lib/pgsql/data/pg_log/postgresql-*.log
top
htop
iostat -x 1
df -h
PostgreSQL 数据目录默认:
/var/lib/pgsql/data
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
配置 postgresql.conf:
shared_preload_libraries = 'pg_stat_statements'
重启数据库。
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
PostgreSQL
↓
postgres_exporter
↓
Prometheus
↓
Grafana
| 分类 | 指标 |
|---|---|
| 连接 | 当前连接数、最大连接数 |
| 性能 | QPS、TPS、慢查询 |
| 资源 | CPU、内存、磁盘 IO |
| 锁 | 死锁、等待事件 |
| 表 | 膨胀、缺失索引 |
✅ 中小系统
psql + pg_stat_activity + 日志
✅ 生产环境
pg_stat_statements + Prometheus + Grafana
如果你愿意,我可以:
你现在用的是 CentOS 几 + PostgreSQL 几?