当业务大面积报错、监控批量告警或数据库整体响应暴涨,且无法快速定位到单条 SQL 或单个应用时,启动全库统一排查。
1. 排查原则
- 由外到内:先确认实例/网络/磁盘,再深入会话和事务。
- 先保命后定位:若系统即将雪崩,先限流、Kill 阻塞源或做主从切换,再保留现场。
- 不加重伤害:排查过程中禁止执行大表全表扫描、无限制排序等操作。
2. 快速检查清单(5 分钟版)
| 检查项 | 常用方法 | 危险阈值/判断标准 |
|---|---|---|
| 实例进程 | ps / systemctl status / 云平台控制台 | 进程消失或反复重启 |
| 连接数 | show global status / pg_stat_activity / v$session | 使用率 > 80% max_connections |
| 活跃会话状态 | show processlist / pg_stat_activity | 大量 active 堆积,或大量 idle in transaction |
| 阻塞与锁 | sys.innodb_lock_waits / pg_locks / v$lock | 存在 Waiting for lock、锁等待链 ≥ 3 层 |
| 长事务 | information_schema.innodb_trx / xact_start | 事务持续 > 300 秒 |
| 磁盘空间 | df -h / 表空间查询 | 使用率 > 85%,或日志盘满 |
| 日志错误 | Error Log / Alert Log / 慢日志 | 最近 30 分钟出现 FATAL、OOM、checkpoint 异常 |
| 主从/集群状态 | show slave status / 集群健康接口 | 延迟 > 10 秒或节点离线 |
| 服务器负载 | top / iostat -x 1 | CPU us+sy > 90% 或磁盘 %util > 90% |
| 近期变更 | 发布系统 / DBA 工单 / 配置中心 | 故障时间点前后 30 分钟内有变更 |
3. 常见全库级问题速查
- 连接打满:连接池配置过大、突增流量、慢 SQL 拖住连接不释放。
- 锁风暴:未提交事务持有行锁或元数据锁,后续请求全部堆积。
- IO 打满:批量刷脏页、全表扫描、备份任务与业务高峰重叠。
- 参数/版本变更异常:如内存参数调整不当导致 OOM,或优化器行为突变。
4. 现场保留与应急
- 保留证据:截图
processlist、导出trx和lock信息、保存 Error Log 片段。 - 快速恢复手段:
- 确认阻塞源后,记录 SQL 和事务信息后
Kill。 - 连接数爆满时,临时抬升
max_connections(需评估内存余量)并对应用限流。 - 磁盘满时,先清过期日志/备份,禁止直接删数据文件。
- 双人复核:Kill 会话、重启实例、变更参数须两人确认。
5. 排查输出
排查结束后 10 分钟内输出《全库问题排查记录》,至少包含:
- 故障时间线(发现时间、排查开始时间、恢复时间)。
- 根因分类(连接/锁/IO/变更/其他)。
- 关键截图与 SQL。
- 后续改进项(如索引优化、连接池治理、发布窗口调整)。