一、常见故障排查思路
-
先看服务是否正常
- 启动失败:查看错误日志
error log - 连接失败:端口、防火墙、权限、最大连接数
- 启动失败:查看错误日志
-
先定位瓶颈
- CPU 高:慢查询、索引缺失、大量排序 / 分组
- IO 高:大量随机 IO、无索引、大表全表扫描
- 内存高:连接数过多、缓冲池设置不合理、大事务
-
常用排查命令
sql
-- 查看连接与状态 SHOW PROCESSLIST; SHOW STATUS LIKE 'Threads%'; SHOW STATUS LIKE 'Connections'; -- 查看引擎状态(重点) SHOW ENGINE INNODB STATUS; -- 查看变量配置 SHOW VARIABLES LIKE '%buffer_pool%'; SHOW VARIABLES LIKE '%max_connections%'; -- 查看慢查询是否开启 SHOW VARIABLES LIKE 'slow_query_log%';
二、典型故障场景与处理
1. 连接不上 MySQL
- 服务未启动:
systemctl start mysqld - 端口被占用 / 防火墙拦截:关闭防火墙或开放 3306
- 密码错误、IP 未授权:
grant all on *.* to user@'%' identified by 'xxx'; - 连接数满:
max_connections过小,或有大量 Sleep 连接
2. CPU 100%、数据库卡顿
- 执行
SHOW PROCESSLIST;找到耗时 SQL - 分析执行计划:
EXPLAIN 你的SQL; - 常见原因:
- 无索引、索引失效
select *、大表limit偏移量过大order by / group by无索引- 大量子查询、
in过多值
- 处理:kill 阻塞会话 + 加索引 + 优化 SQL
3. 磁盘 IO 极高、查询慢
- 全表扫描严重:
EXPLAIN中type=ALL - InnoDB 缓冲池过小:
innodb_buffer_pool_size建议设为物理内存 50%~70% - 大量写入:redo log 太小、刷盘策略激进
- 临时表磁盘化:
order by/group by无索引导致Using temporary; Using filesort
4. 事务锁等待、死锁
- 查看锁等待:
SHOW ENGINE INNODB STATUS; - 死锁原因:
- 事务过大、执行时间长
- 更新同一行数据顺序不一致
- 解决:
- 缩短事务,避免长事务
- 统一更新顺序
- 避免
select ... for update大范围锁定
5. 主从复制异常
- 同步延迟:大事务、从库性能差、网络延迟
- 同步中断:主键冲突、语句执行报错
- 处理:
- 跳过错误:
set global sql_slave_skip_counter=1; start slave; - 重新导入数据、重建主从
- 跳过错误:
三、SQL 优化核心原则
- 建索引
- 经常
where、order by、group by、join的字段建索引 - 联合索引遵循最左前缀原则
- 避免冗余索引、重复索引
- 经常
- 避免索引失效
- 不要对索引字段做函数、运算
- 避免
!=、is not null、like '%xxx%' - 隐式类型转换会导致索引失效
- SQL 写法优化
- 禁止
select *,只查需要字段 - 大分页优化:
where id > 10000 limit 100 - 少用子查询,优先用
join - 避免
in大量值,可用临时表或join替代
- 禁止
四、MySQL 配置优化(InnoDB)
ini
# 连接数
max_connections = 1000
# InnoDB缓冲池(关键)
innodb_buffer_pool_size = 物理内存*0.6~0.7
# Redo Log
innodb_log_file_size = 1G
innodb_log_files_in_group = 2
# 刷盘策略(高性能)
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0
# 临时表
tmp_table_size = 64M
max_heap_table_size = 64M
# 慢查询
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /var/log/mysql/slow.log
五、日常监控与巡检
- 慢查询日志分析:
mysqldumpslow、pt-query-digest - 关键监控指标:
- QPS、TPS
- 连接数、慢查询数
- InnoDB 缓冲池命中率
- 锁等待、死锁次数
- 主从延迟
- 定期优化:
- 清理冗余索引
- 优化大表、分库分表
- 清理历史数据,避免单表过大