一、故障排查核心流程
- 现象定位:连接失败、慢查询、CPU/IO 高、锁等待、主从延迟、OOM、宕机
- 排查顺序:服务状态 → 错误日志 → 慢查询日志 → 实时进程 → 系统资源
- 分层排查:应用层 → 网络层 → MySQL 服务层 → 存储引擎层 → 系统层
二、常见故障速查
|----------|------------------------------------------------------------------------------|--------------------------------------------|
| 故障类型 | 排查命令 / 方法 | 解决方案 |
| 无法连接 | systemctl status mysqld、telnet ip 3306、show variables like 'max_connections' | 启动服务、开放防火墙、授权 user@host、调大连接数、检查密码 /socket |
| CPU 100% | show full processlist;、explain select...;、show status like 'Select%' | 优化慢查询、加索引、避免全表扫描、减少排序 / 分组 |
| IO 高 | 查看 redo log 大小、Created_tmp_disk_tables、索引碎片 | 调整刷盘策略、增大 tmp_table_size、优化索引、清理碎片 |
| 锁等待 / 死锁 | show engine innodb status\G、performance_schema.data_locks | 减小事务粒度、避免长事务、热点更新队列化、调整隔离级别 |
| 主从延迟 | show slave status\G、show master status; | 升级 MySQL 多线程复制、拆分大事务、给无主键表加主键、减轻从库压力 |
| OOM 内存溢出 | 检查 innodb_buffer_pool_size、连接数、临时表 | 合理分配内存、限制连接数、使用连接池、调小会话级缓存 |
| 表损坏 | MyISAM:myisamchk;InnoDB:innodb_force_recovery | 修复表文件、检查磁盘、恢复备份 |
三、优化核心方向(实操优先)
1. SQL 优化(最关键)
- 避免:select *、like '%xxx%'、隐式转换、大 in、子查询嵌套过深
- 分页优化:limit 100000,10 → 延迟关联 / 主键分页
- 索引利用:覆盖索引、联合索引(最左前缀)、避免索引失效
2. 索引优化
- 高频查询字段建索引,单表索引 ≤ 5 个
- 联合索引顺序:等值匹配 → 范围查询 → order by
- 删除重复 / 冗余 / 未使用索引,更新频繁字段慎建索引
3. 关键配置(my.cnf 精简)
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [mysqld] character-set-server=utf8mb4 max_connections=1000 wait_timeout=600 innodb_buffer_pool_size=物理内存50%-70% innodb_log_file_size=1G-4G innodb_flush_log_at_trx_commit=1(强一致)/2(性能) sync_binlog=1(强一致)/1000(性能) tmp_table_size=64M max_heap_table_size=64M sort_buffer_size=256K join_buffer_size=256K slow_query_log=1 long_query_time=1 log_queries_not_using_indexes=1 |
4. 表结构优化
- 合适字段类型:int > varchar、datetime 替代字符串
- 必须主键(自增 bigint),大字段(text/blob)拆分
- 单表数据量 2000w,必要时分库分表 / 分区
5. 架构优化
- 读写分离、连接池(druid/hikari)、Redis 缓存
- 高可用:MGR、MHA、主从切换
四、高频排查命令
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| -- 连接与进程 show full processlist; show variables like 'max_connections'; show status like 'Threads_connected'; -- 慢查询 show variables like '%slow%'; show status like 'Slow_queries'; -- InnoDB 状态 show engine innodb status\G -- 锁与事务 select * from information_schema.innodb_trx; select * from performance_schema.data_locks; -- 索引与执行计划 show index from table_name; explain analyze select ...; -- 主从复制 show slave status\G show master status; |
五、必监控指标
- QPS/TPS、慢查询数、连接数 / 活跃线程
- InnoDB 缓存命中率、锁等待 / 死锁次数
- 主从延迟、CPU / 内存 / 磁盘 IO / 磁盘使用率