MySQL 故障排查与优化

一、故障排查核心流程

  1. 现象定位:连接失败、慢查询、CPU/IO 高、锁等待、主从延迟、OOM、宕机
  2. 排查顺序:服务状态 → 错误日志 → 慢查询日志 → 实时进程 → 系统资源
  3. 分层排查:应用层 → 网络层 → 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 / 磁盘使用率
相关推荐
SkyWalking中文站5 小时前
认识 Horizon UI · 1/17:SkyWalking 新一代可观测性控制台
运维·前端·监控
雪梨酱QAQ8 小时前
Kubeneters HA Cluster部署
运维
江华森12 小时前
Spring Cloud 微服务全栈实战:从 Eureka 到 Docker Compose 一文贯通
运维
江华森12 小时前
Matplotlib 数据绘图基础入门
运维
江华森12 小时前
NumPy 数值计算基础入门
运维
大大大大晴天2 天前
Hudi Metadata Table 与 Hive Sync (HMS)怎么选?
大数据
唐青枫2 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
手可摘星辰7773 天前
一次线上FlinkCDC异常排查复盘
大数据·flink
小满8783 天前
5.Mysql事务隔离级别与锁机制
mysql
大大大大晴天3 天前
Hudi技术内幕:Metadata Table原理与实践
大数据