数据库故障排查与优化全攻略

#数据库故障排查指南#

目录

  1. 故障分类与优先级

  2. 通用排查流程

  3. 常见故障场景与解决方案

  4. 工具与命令速查

  5. 预防性措施

  6. 典型案例分析


1. 故障分类与优先级

1.1 故障等级定义

等级描述响应时间要求
P0数据库完全不可用(如宕机、数据丢失)≤15分钟
P1核心业务功能受损(如性能下降50%)≤1小时
P2非核心功能异常(如备份失败)≤4小时

1.2 常见故障类型

故障类别典型表现
连接问题"Too many connections" 错误
性能问题CPU长期>90%,查询响应超时
数据一致性主从不一致、事务回滚失败
存储问题磁盘空间不足、IO延迟飙升
备份/恢复失败备份中断、恢复后数据缺失

2. 通用排查流程

2.1 关键信息收集清单

  1. 数据库日志

    # MySQL  
    SHOW ENGINE INNODB STATUS;  
    SELECT * FROM information_schema.INNODB_TRX;  
    
    # PostgreSQL  
    SELECT * FROM pg_stat_activity;  
    SELECT * FROM pg_locks;  
     
  2. 系统资源监控

    top -c          # CPU/内存分析  
    iostat -x 2     # 磁盘IO监控  
    netstat -antp   # 网络连接检查  
     
  3. 慢查询识别

    -- MySQL  
    SET GLOBAL slow_query_log = 1;  
    SELECT * FROM mysql.slow_log;  
    
    -- SQL Server  
    SELECT * FROM sys.dm_exec_query_stats;  
     

3. 常见故障场景与解决方案

3.1 连接池耗尽

现象ERROR 1040 (HY000): Too many connections
排查步骤

  1. 检查当前连接数:

    SHOW STATUS LIKE 'Threads_connected';  
     
  2. 分析连接来源:

    SELECT user, host, db, command FROM information_schema.PROCESSLIST;  
     
  3. 应急处理

    SET GLOBAL max_connections = 500;  -- 临时扩容  
    KILL [PROCESS_ID];                -- 终止异常连接  
     

3.2 慢查询导致CPU飙升

定位方法

-- MySQL  
SELECT * FROM sys.session WHERE time_ms > 1000;  

-- PostgreSQL  
SELECT pid, query, NOW() - query_start AS duration  
FROM pg_stat_activity  
WHERE state = 'active';  
 

优化方案

  1. 添加缺失索引:

    EXPLAIN SELECT * FROM orders WHERE user_id = 100;  
    CREATE INDEX idx_user ON orders(user_id);  
     
  2. 重写低效SQL:

    -- 反例:全表扫描  
    SELECT * FROM logs WHERE DATE(create_time) = '2023-10-01';  
    
    -- 优化后:范围查询  
    SELECT * FROM logs  
    WHERE create_time BETWEEN '2023-10-01 00:00:00' AND '2023-10-01 23:59:59';  
     

4. 工具与命令速查

4.1 常用诊断工具

工具用途示例命令
pt-query-digestMySQL慢查询分析pt-query-digest slow.log
pgBadgerPostgreSQL日志分析pgbadger postgresql.log
mytop实时MySQL监控mytop -u root -p 123456

4.2 紧急恢复命令

-- 强制主从切换(MySQL)  
STOP SLAVE;  
RESET SLAVE ALL;  
CHANGE MASTER TO ...  
START SLAVE;  

-- 数据误删恢复(需开启binlog)  
mysqlbinlog --start-position=123456 binlog.000001 | mysql -u root  
 

5. 预防性措施

5.1 监控体系建设

监控项推荐阈值工具集成
连接数使用率>80% 告警Prometheus + Grafana
复制延迟>60秒 告警Zabbix
磁盘空间>85% 告警Nagios

5.2 定期健康检查

# MySQL检查脚本示例  
#!/bin/bash  
mysql -e "CHECK TABLE important_table;"  
mysql -e "ANALYZE TABLE user_profile;"  
mysqldump --single-transaction --all-databases > /backup/full_backup.sql  
 

6. 典型案例分析

案例1:死锁导致事务堆积

现象

  • 每秒事务量从200骤降至5

  • 出现大量Lock wait timeout错误

排查过程

  1. 检查当前锁状态:

    SHOW ENGINE INNODB STATUS\G  
  2. 发现多个事务持有X锁互相等待

  3. 解决方案

    • 优化事务逻辑,减少锁范围

    • 设置合理的innodb_lock_wait_timeout

案例2:磁盘IO瓶颈

现象

  • 查询响应时间波动大

  • iowait持续高于30%

根因分析

  1. 通过iostat发现磁盘利用率达100%

  2. 检查发现未启用SSD缓存

  3. 改进措施

    • 升级为NVMe SSD

    • 调整innodb_io_capacity参数


附录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值