07 让 PostgreSQL 跑得稳: 安全、巡检、监控与故障预防
真正稳定的数据库系统,不是“没出过事故”的系统,而是“即使出事故也能快速发现、快速定位、快速止损”的系统。很多团队以为自己在做运维,其实只是把实例跑起来了。真正的运维能力,至少要覆盖四件事: 权限边界、日常巡检、可观测性、恢复演练。
安全是最容易被低估的稳定性问题
数据库安全不只是防攻击,它直接影响系统可维护性。账号乱、权限乱、审计缺失,最后带来的不仅是泄露风险,还有排障困难和变更失控。
最基本的安全要求应该包括:
- 应用账号和管理账号分离
- 最小权限原则
- 敏感操作有明确责任边界
- 登录来源可控
- 密码、证书、连接方式有统一规范
一个很实际的判断标准是: 你能不能在十分钟内说清楚“哪个服务用哪个账号、能干什么、不能干什么”。如果做不到,风险就已经存在了。
巡检不等于看几个监控图
高质量巡检不是“看看 CPU、内存、磁盘”,而是围绕数据库真正的运行机制去看。
最值得长期跟踪的指标包括:
- 活跃连接数和等待连接数
- 长事务和
idle in transaction - 锁等待链
- 慢 SQL 分布
- autovacuum 是否跟得上
- 死元组和膨胀趋势
- WAL 增长速度
- 检查点压力
- 复制延迟
- 备份结果和恢复点可用性
这些指标里,有些是性能问题的前兆,有些是恢复问题的前兆,有些则是业务使用方式失控的前兆。
两条特别值钱的排查 SQL
看长事务
select pid, usename, now() - xact_start as xact_age, state, query
from pg_stat_activity
where xact_start is not null
order by xact_start;看 idle in transaction
select pid, usename, now() - state_change as idle_age, query
from pg_stat_activity
where state = 'idle in transaction'
order by state_change;很多看起来像性能问题的故障,最后根源都在这两类会话上。
可观测性应该分三层
1. 指标
解决“哪里不对”。
2. 日志
解决“发生了什么”。
3. 跟踪和采样
解决“为什么发生”。
这三层缺一不可。只有指标没有日志,定位会很粗;只有日志没有趋势图,无法判断问题是偶发还是持续;没有采样和跟踪工具,很多高频低耗时问题会很难抓。
预防比救火更重要的几个点
1. autovacuum 不是可有可无
很多团队直到表膨胀、事务号年龄异常时,才意识到 autovacuum 不是“后台小功能”,而是 PostgreSQL 正常运行的一部分。
2. 连接数不是越多越好
连接堆高通常不是数据库强,而是应用或架构已经出了问题。数据库连接应该被当作受控资源,而不是无限池子。
3. 监控必须带阈值和动作
只画图不设阈值、只报警不配动作手册,实际效果有限。真正有效的监控,应该能直接触发明确处理动作。
一套够用的日常节奏
- 每天: 看慢 SQL、长事务、等待链、复制延迟、备份结果。
- 每周: 看膨胀趋势、热点表、热点 SQL、权限变更、失败日志。
- 每月: 做一次恢复验证,复盘慢查询治理和容量变化。
真正的运维能力是什么
不是记住多少参数,而是建立一套闭环:
- 提前看见风险
- 出问题时知道先看哪里
- 处理完之后能防止再次发生
只要这套闭环建立起来,PostgreSQL 的稳定性会比很多团队想象中更可控。