主题
PostgreSQL 生产检查清单
适用 PostgreSQL 13+、pgvector 0.8.x。每条都可勾选,括号内是默认值或判断依据;版本差异以官方文档为准。 这份清单只列「不做会出事」的动作,机制解释见各篇正文。
上线前
- [ ] 内存参数按比例给:
shared_buffers=物理内存 25%、effective_cache_size=75%;work_mem按并发算(默认 4MB,以官方文档为准),一个查询的多个 Sort/Hash 各占一份。 - [ ] 连接数走池:PgBouncer 用
pool_mode=transaction,max_connections=200–500;按每连接约 10MB 估内存,max_client_conn/default_pool_size压到后端能承受。 - [ ] VACUUM 与回卷余量:autovacuum 常开,大表
autovacuum_vacuum_scale_factor=0.01(默认 0.2,以官方文档为准);死元组占比 >20% 告警;监控age(datfrozenxid)距autovacuum_freeze_max_age=2 亿的余量。 - [ ] 备份与切换都演练过:
pg_basebackup -X stream+ WAL 归档(archive_mode=on、archive_timeout=60),pgBackRest/Barman 做保留校验;至少 1 个同步 Standby + Patroni 3 节点 etcd;本季度做过一次 PITR 恢复和一次主库切换。 - [ ] DDL 不锁全表:大表建索引用
CREATE INDEX CONCURRENTLY,空间回收用pg_repack;禁止业务高峰执行VACUUM FULL(ACCESS EXCLUSIVE 阻塞全表)。 - [ ] JSONB 索引用对:GIN 索引用
jsonb_path_ops,查询必须写@>;->>条件单独建表达式索引,否则退化为全表扫描。 - [ ] pgvector 参数匹配:距离运算符与 opclass 对应(
<=>↔vector_cosine_ops);maintenance_work_mem覆盖建索引批次;按「向量+图」估内存(1536 维 float32 约 6KB/条)。
运行中
- [ ] SQL 与计划:
pg_stat_statements按total_exec_time看 Top SQL;log_min_duration_statement=1000(ms)配auto_explain;shared_blks_hit/(shared_blks_hit+shared_blks_read)命中率下降先查内存与慢 SQL。 - [ ] 会话与等待:
pg_stat_activity中state<>'idle'且xact_start超过 5 秒的会话;wait_event长期不变说明在等锁或 IO。 - [ ] 复制、归档与膨胀:
pg_last_wal_receive_lsn() - pg_last_wal_replay_lsn()字节差;pg_stat_archiver的失败数与最后归档时间;死元组和索引膨胀按周看趋势。
故障时
- [ ] 磁盘只涨不降、DELETE 后不回收 →
pg_stat_user_tables.n_dead_tup/n_live_tup+last_autovacuum→ VACUUM 跟不上 → 调低 scale_factor,必要时pg_repack。 - [ ] 数据库突然只读、报事务 ID 相关错误 →
age(datfrozenxid)接近 2 亿 → 已到回卷保护 → 立即VACUUM FREEZE,不要靠重启硬扛。 - [ ] 报
too many clients→pg_stat_activity按 state 计数对比max_connections→ 连接泄漏或池配置错误 → 修连接池,不要直接调大max_connections。 - [ ] DDL/查询卡住、后续全排队 →
pg_blocking_pids(pid)+pg_locks→ 有会话持有 ACCESS EXCLUSIVE → 终止阻塞者或改CONCURRENTLY;deadlock_timeout=1s,开log_lock_waits。 - [ ] 查询变慢、计划出现 Seq Scan →
EXPLAIN (ANALYZE, BUFFERS)对比 rows 预估与 actual → 统计信息过期先ANALYZE,仍偏再建扩展统计;JSONB 则确认是否用了@>。