这是《PostgreSQL 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 PostgreSQL 监控要覆盖可用性、连接、事务、锁、复制、WAL、VACUUM、缓存和 SQL 成本。
27.1 核心指标
| 分类 | 指标 |
|---|---|
| 服务 | 存活、可读写、连接数 |
| 连接 | active、idle、idle in transaction |
| 事务 | xact_commit、xact_rollback |
| 锁 | 等待数、最长等待 |
| 复制 | LSN 延迟、状态 |
| WAL | 生成量、归档失败 |
| 清理 | 死元组、表年龄 |
| 缓存 | 命中率、临时文件 |
| SQL | 慢查询、错误率 |
27.2 连接与活动
SELECT state, wait_event_type, count(*)
FROM pg_stat_activity
GROUP BY state, wait_event_type;
长事务:
SELECT pid, now() - xact_start AS duration, state, query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
ORDER BY xact_start;
27.3 数据库统计
SELECT
datname,
xact_commit,
xact_rollback,
blks_read,
blks_hit,
temp_files,
pg_size_pretty(temp_bytes) AS temp_size,
deadlocks
FROM pg_stat_database;
27.4 表与索引
SELECT
relname,
seq_scan,
idx_scan,
n_live_tup,
n_dead_tup,
last_autovacuum,
last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
27.5 复制与 WAL
SELECT client_addr, state, sync_state,
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_bytes
FROM pg_stat_replication;
SELECT archived_count, failed_count
FROM pg_stat_archiver;
27.6 常见故障
| 现象 | 排查 |
|---|---|
| 连接耗尽 | pg_stat_activity、连接池 |
| CPU 高 | pg_stat_statements、执行计划 |
| IO 高 | buffers、临时文件、检查点 |
| 锁等待 | pg_locks、等待事件 |
| 磁盘涨 | WAL、复制槽、膨胀 |
| 备库延迟 | 网络、回放、大事务 |
| SQL 变慢 | 统计、索引、数据增长 |
27.7 连接耗尽
查看:
SHOW max_connections;
SELECT count(*), state FROM pg_stat_activity GROUP BY state;
处理:
- 终止异常连接;
- 排查泄漏;
- 调整池大小;
- 治理长事务;
- 必要时临时提升 max_connections 并重启。
27.8 磁盘增长
顺序:
- 检查数据目录大文件;
- 检查 WAL 目录;
- 检查复制槽;
- 检查归档失败;
- 检查表膨胀;
- 检查日志文件;
- 扩容或清理。
27.9 日志配置
logging_collector = on
log_min_duration_statement = 500
log_lock_waits = on
log_checkpoints = on
log_autovacuum_min_duration = 0
日志要集中采集,并保留足够回溯时间。
本章小结
监控的目的是发现趋势和定位因果。PostgreSQL 统计视图非常丰富,应结合系统指标、日志和 SQL 执行计划建立完整观测面。
思考题
- idle in transaction 为什么危险?
- 如何发现表膨胀和清理滞后?
- 复制延迟应监控哪个位置?
- 磁盘增长如何快速定位?
- 生产日志应开启哪些项?