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 / 磁盘使用率
相关推荐
Elastic 中国社区官方博客2 小时前
当 TSDS 遇到 ILM:设计不会拒绝延迟数据的时间序列数据流
大数据·运维·数据库·elasticsearch·搜索引擎·logstash
qing222222222 小时前
Linux中修改mysql数据表
linux·运维·mysql
Omics Pro2 小时前
虚拟细胞:开启HIV/AIDS治疗新纪元的关键?
大数据·数据库·人工智能·深度学习·算法·机器学习·计算机视觉
TechWayfarer2 小时前
科普:IP归属地中的IDC/机房/家庭宽带有什么区别?
服务器·网络·tcp/ip
J2虾虾2 小时前
MySQL的基本操作
数据库·mysql
沐风___3 小时前
Claude Code 权限模式完全指南:Auto、Bypass、Ask 三模式深度解析
大数据·elasticsearch·搜索引擎
杨云龙UP3 小时前
Oracle 中 NOMOUNT、MOUNT、OPEN 怎么理解? 在不同场景下如何操作?_20260402
linux·运维·数据库·oracle
Amctwd3 小时前
【Linux】OpenCode 安装教程
linux·运维·服务器
KOYUELEC光与电子努力加油3 小时前
JAE日本航空端子推出支持自走式机器人的自主充电功能浮动式连接器“DW15系列“方案与应用
服务器·人工智能·机器人·无人机
2601_949815333 小时前
MySQL输入密码后闪退?
数据库·mysql·adb