PostgreSQLNotes

第 27 章:监控与故障排查

zjc 于 2026-01-27 发布

这是《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;

处理:

  1. 终止异常连接;
  2. 排查泄漏;
  3. 调整池大小;
  4. 治理长事务;
  5. 必要时临时提升 max_connections 并重启。

27.8 磁盘增长

顺序:

  1. 检查数据目录大文件;
  2. 检查 WAL 目录;
  3. 检查复制槽;
  4. 检查归档失败;
  5. 检查表膨胀;
  6. 检查日志文件;
  7. 扩容或清理。

27.9 日志配置

logging_collector = on
log_min_duration_statement = 500
log_lock_waits = on
log_checkpoints = on
log_autovacuum_min_duration = 0

日志要集中采集,并保留足够回溯时间。

本章小结

监控的目的是发现趋势和定位因果。PostgreSQL 统计视图非常丰富,应结合系统指标、日志和 SQL 执行计划建立完整观测面。

思考题

  1. idle in transaction 为什么危险?
  2. 如何发现表膨胀和清理滞后?
  3. 复制延迟应监控哪个位置?
  4. 磁盘增长如何快速定位?
  5. 生产日志应开启哪些项?