在 CentOS 上监控 PostgreSQL,可以从系统层、数据库层、日志、以及第三方工具几个维度来做。下面按“由浅入深”的方式说明。
ps -ef | grep postgres
或
systemctl status postgresql
ss -lntp | grep 5432
或
netstat -an | grep 5432
top
htop
iostat -x 1
free -h
关注:
su - postgres
psql
常用 SQL:
-- 当前连接
SELECT * FROM pg_stat_activity;
-- 数据库整体统计
SELECT * FROM pg_stat_database;
-- 表级统计
SELECT * FROM pg_stat_user_tables;
-- 慢查询
SELECT * FROM pg_stat_activity
WHERE state <> 'idle'
ORDER BY query_start;
编辑 postgresql.conf(通常在 /var/lib/pgsql/data/ 或 /etc/postgresql/):
log_min_duration_statement = 1000 # 记录超过 1 秒的 SQL
logging_collector = on
log_directory = 'log'
重启:
systemctl restart postgresql
CREATE EXTENSION pg_stat_statements;
配置:
shared_preload_libraries = 'pg_stat_statements'
查看最耗资源的 SQL:
SELECT query, calls, total_exec_time
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
组件:
postgres_exporter流程:
PostgreSQL → postgres_exporter → Prometheus → Grafana
监控指标示例:
| 指标 | 说明 |
|---|---|
| 连接数 | 是否接近 max_connections |
| 慢查询 | 是否存在长时间 SQL |
| 锁等待 | 是否有死锁或长事务 |
| 缓存命中率 | 低于 95% 可能有问题 |
| WAL 生成量 | 写压力 |
| 复制延迟 | 主从是否同步 |
SELECT count(*) FROM pg_stat_activity;
SHOW max_connections;
如果你愿意,我可以: