Skip to content

PostgreSQL 故障处理流程规范

故障分类与级别

故障分类

  1. 硬件故障

    • 服务器故障(CPU、内存、磁盘)
    • 存储故障(磁盘损坏、RAID失效)
    • 网络故障(网络中断、延迟过高)
  2. 软件故障

    • 数据库进程崩溃
    • 死锁
    • 内存泄漏
    • 配置错误
  3. 数据故障

    • 数据损坏
    • 数据丢失
    • 数据不一致
  4. 性能故障

    • 慢查询
    • 高CPU/内存使用率
    • 连接数耗尽

故障级别

  1. P0级故障:系统完全不可用,影响所有用户
  2. P1级故障:系统部分不可用,影响大量用户
  3. P2级故障:系统性能严重下降,影响部分用户
  4. P3级故障:系统存在隐患,但未影响用户

故障处理流程

故障发现与报告

  1. 故障发现渠道

    • 监控系统告警(如Prometheus、Zabbix)
    • 用户投诉
    • 例行巡检
    • 日志分析
  2. 故障报告内容

    • 故障时间和发现时间
    • 故障现象和影响范围
    • 初步判断的故障类型
    • 报告人和联系方式
  3. 报告流程

    • P0/P1级:立即电话或紧急通讯工具通知相关人员
    • P2/P3级:通过故障管理系统提交故障单

故障诊断

  1. 基本诊断步骤

    bash
    # 检查数据库进程状态
    pg_ctl status -D /path/to/data
    
    # 检查日志
    tail -n 100 /path/to/logs/postgresql.log
    
    # 检查系统资源
    top
    iostat -x 1
    vmstat 1
    
    # 检查数据库连接
    psql -c "SELECT * FROM pg_stat_activity;"
  2. 常见故障诊断

    sql
    -- 检查死锁
    SELECT * FROM pg_stat_activity WHERE waiting = true;
    
    -- 检查慢查询
    SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;
    
    -- 检查表和索引状态
    SELECT relname, last_vacuum, last_analyze FROM pg_stat_user_tables;
    
    -- 检查WAL状态
    SELECT * FROM pg_stat_archiver;
  3. 诊断工具

    • pg_top:实时监控PostgreSQL性能
    • pg_stat_statements:慢查询分析
    • pgBadger:日志分析
    • pg_dump/pg_restore:数据验证

故障修复

  1. 硬件故障修复

    • 更换故障硬件
    • 切换到备用服务器
    • 恢复数据到新硬件
  2. 软件故障修复

    bash
    # 重启数据库
    pg_ctl restart -D /path/to/data -m fast
    
    # 修复配置错误
    vi /path/to/data/postgresql.conf
    pg_ctl reload -D /path/to/data
    
    # 终止阻塞进程
    psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle in transaction' AND state_change < current_timestamp - interval '1 hour';"
  3. 数据故障修复

    sql
    -- 修复数据损坏
    REINDEX TABLE table_name;
    VACUUM FULL VERBOSE table_name;
    
    -- 从备份恢复
    pg_restore -d dbname backup.dump
    
    -- 使用pg_resetwal修复WAL问题
    pg_resetwal -D /path/to/data
  4. 性能故障修复

    sql
    -- 优化慢查询
    EXPLAIN ANALYZE SELECT * FROM table_name WHERE condition;
    CREATE INDEX idx_name ON table_name(column_name);
    
    -- 调整参数
    ALTER SYSTEM SET work_mem = '64MB';
    ALTER SYSTEM SET maintenance_work_mem = '1GB';
    SELECT pg_reload_conf();

故障验证

  1. 功能验证

    sql
    -- 检查数据库连接
    psql -c "SELECT 1;"
    
    -- 验证核心功能
    SELECT count(*) FROM important_table;
    
    -- 验证应用功能
    -- 运行应用的健康检查API
  2. 性能验证

    bash
    -- 运行性能测试
    pgbench -c 10 -j 4 -t 1000 dbname
    
    -- 检查系统资源使用率
    top -c

故障关闭与复盘

  1. 故障关闭条件

    • 故障已完全修复
    • 系统功能恢复正常
    • 性能指标恢复正常
    • 经过足够的观察期
  2. 故障总结报告

    • 故障原因分析
    • 修复过程记录
    • 影响范围和持续时间
    • 经验教训和改进措施
  3. 知识库更新

    • 将故障案例添加到知识库
    • 更新故障处理手册
    • 分享经验教训

常见故障处理示例

1. 数据库无法启动

故障现象:pg_ctl start 失败

诊断步骤

bash
# 检查日志
tail -n 200 /path/to/logs/postgresql.log

# 检查数据目录权限
ls -la /path/to/data

# 检查端口占用
netstat -tlnp | grep 5432

修复方法

bash
# 修复权限
chown -R postgres:postgres /path/to/data

# 释放端口
kill -9 $(lsof -t -i:5432)

# 修复WAL问题
pg_resetwal -D /path/to/data

2. 慢查询导致系统负载过高

故障现象:CPU使用率100%

诊断步骤

sql
-- 查找消耗CPU最高的查询
SELECT pid, usename, query, state FROM pg_stat_activity ORDER BY query_start ASC;

-- 查看慢查询执行计划
EXPLAIN ANALYZE SELECT * FROM large_table WHERE unindexed_column = 'value';

修复方法

sql
-- 终止慢查询
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE query LIKE '%large_table%' AND state = 'active';

-- 创建索引
CREATE INDEX idx_large_table_unindexed ON large_table(unindexed_column);

故障预防与改进

1. 监控与告警优化

  1. 关键监控指标

    • 数据库进程状态
    • 连接数
    • 慢查询数量
    • WAL生成速率
    • 系统资源使用率
  2. 告警阈值设置

    • CPU使用率 > 80% 持续5分钟
    • 连接数 > 90% 最大连接数
    • 慢查询数量 > 10 个/分钟

2. 定期维护

  1. 日常维护

    bash
    # 清理死连接
    psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle' AND state_change < current_timestamp - interval '1 hour';"
    
    # 分析表
    psql -c "ANALYZE VERBOSE;"
  2. 周维护

    bash
    # 重建索引
    psql -c "REINDEX DATABASE dbname;"
    
    # 检查数据完整性
    pg_dump dbname > /dev/null
  3. 月维护

    bash
    # 进行全量备份
    pg_dump -F c -b -v -f /path/to/backup/full_backup.dump dbname
    
    # 测试恢复
    pg_restore -d test_db /path/to/backup/full_backup.dump

故障处理工具

1. 监控工具

  1. Prometheus + Grafana

    • 实时监控数据库性能
    • 自定义告警规则
    • 可视化仪表盘
  2. pg_stat_monitor

    • 增强的统计信息收集
    • 更好的慢查询分析
    • 支持PostgreSQL 13+

2. 诊断工具

  1. pg_top

    • 类似top的PostgreSQL监控工具
    • 显示进程级别的资源使用情况
  2. pgBadger

    • 日志分析工具
    • 生成HTML格式的报告
    • 支持慢查询分析
  3. pg_resetwal

    • 修复WAL相关问题
    • 仅在紧急情况下使用

常见问题(FAQ)

Q1:如何判断故障是否需要回滚?

A1:根据以下因素判断:

  1. 修复时间:如果修复时间过长,影响用户,考虑回滚
  2. 修复风险:如果修复操作风险高,考虑回滚
  3. 回滚成本:评估回滚对数据一致性的影响
  4. 业务需求:根据业务容忍度决定

Q2:故障处理过程中如何避免数据丢失?

A2:

  1. 优先使用只读操作进行诊断
  2. 修复前进行数据备份
  3. 对于数据修改操作,先在测试环境验证
  4. 遵循最小化修改原则

Q3:如何提高故障处理效率?

A3:

  1. 建立完善的监控和告警机制
  2. 编写标准化的故障处理手册
  3. 定期进行故障演练
  4. 建立知识库,积累故障案例
  5. 团队成员定期培训

Q4:故障恢复后需要做什么?

A4:

  1. 进行全面的功能和性能验证
  2. 分析故障原因,更新预防措施
  3. 编写故障总结报告
  4. 更新相关文档和知识库
  5. 进行故障复盘会议

Q5:如何预防类似故障再次发生?

A5:

  1. 修复根本原因,而不仅仅是症状
  2. 优化监控和告警配置
  3. 加强定期维护
  4. 更新配置和架构
  5. 进行相关培训和演练