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 / 磁盘使用率
相关推荐
极光代码工作室16 小时前
基于Spark的日志监控与分析平台
大数据·hadoop·python·spark·数据可视化
AOwhisky16 小时前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
前端世界16 小时前
MySQL 基础入门(学习第4天)——约束与 DML 操作详解
数据库·学习·mysql
AOwhisky16 小时前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko
wuhanzhanhui16 小时前
从高强钢到碳纤维!2026武汉汽车材料轻量化制造技术展会,重塑未来造车新范式
大数据·汽车·制造
lupai17 小时前
手机在网状态查询 API 新手实战指南
大数据·python·智能手机
imc.1117 小时前
linux基础IO
linux·运维·服务器
躺不平的理查德17 小时前
让Ubuntu 的第二块网卡 ens37 永久固定为 192.168.30.111
运维·服务器
AI_Auto17 小时前
工业与AI融合应用 | 四个实战用例!机械装备行业AI+数字孪生+机器人落地全景
大数据·人工智能·机器人·制造
bitbrowser18 小时前
Facebook 验证反复回到原页面,应该从哪里排查
运维·服务器·facebook