MySQL 故障排查与优化

张开发
2026/4/3 9:02:46 15 分钟阅读
MySQL 故障排查与优化
MySQL 故障排查与优化一、日常故障排查思路先看服务状态启动失败查看错误日志error.log常见原因端口占用、配置错误、权限不足、磁盘满。无法连接检查端口 3306、防火墙、bind-address、授权用户主机限制。查看关键日志错误日志记录启动、崩溃、严重异常。慢查询日志定位低效 SQL。二进制日志数据恢复、主从同步问题排查。连接与权限类故障Access denied密码错误、主机未授权、用户不存在。Too many connections连接数超限调大max_connections或优化连接复用。锁等待与阻塞查看锁等待show processlist;、show engine innodb status;长事务未提交导致锁阻塞需 kill 异常会话。主从复制故障同步延迟网络、大事务、从库性能不足。同步中断主键冲突、语句执行错误、binlog 丢失。修复跳过错误、重新同步、校验数据一致性。二、性能优化方向1. 配置优化my.cnf/my.ini连接与并发max_connections根据业务调整避免过高。wait_timeout/interactive_timeout减少空闲连接占用。InnoDB 核心innodb_buffer_pool_size建议物理内存 50%~70%。innodb_log_file_size提高写入性能不宜过大。innodb_flush_log_at_trx_commit1 强安全2 性能高0 最高性能。查询缓存MySQL 8.0 已移除5.7 建议关闭避免失效开销。2. SQL 优化避免select *只查需要字段。避免where 11等无意义条件避免隐式类型转换。少用order by rand()、in大量值、深度子查询。大limit offset分页优化改为主键范围查询。使用explain分析执行计划重点看type、key、rows、Extra。3. 索引优化高频查询字段建索引避免冗余索引。联合索引遵循最左前缀原则。避免在索引列上使用函数、运算导致索引失效。定期使用pt-index-usage清理无用索引。4. 表结构优化使用合适字段类型int 替代 bigint、datetime 替代 varchar。大字段拆分到附属表避免行过大。避免频繁alter table低峰期执行。分区表优化超大表查询与清理。5. 架构与运维优化读写分离主库写、从库读。分库分表解决单表过大问题。定期优化表optimize table、清理历史数据。监控CPU、内存、IO、连接数、慢查询、锁等待、主从延迟。三、常用排查命令sql-- 查看连接与运行状态 show processlist; show full processlist; -- 查看 InnoDB 状态锁、事务、阻塞 show engine innodb status; -- 查看变量与状态 show variables like %conn%; show status like Threads_connected; show status like Innodb_row_lock%; -- 分析 SQL explain select ...; -- 查看慢查询配置 show variables like slow_query%; show variables like long_query_time; -- 查看主从状态 show slave status\G四、典型故障场景数据库突然卡顿长事务锁表 → 杀事务慢 SQL 耗尽 IO/CPU → 杀掉并优化磁盘 IO 100% → 检查是否有大量排序、临时表数据库宕机重启查看错误日志定位崩溃原因检查 OOM、磁盘满、文件损坏必要时使用备份恢复从库延迟严重大事务如 delete 大量数据从库配置过低、无索引并行复制参数未优化磁盘空间暴涨binlog 未清理 → 配置 expire_logs_days临时表、undo 空间异常大表无归档清理五、优化总结优先解决慢 SQL与索引缺失见效最快。InnoDB 缓冲池是性能核心合理分配内存。避免长事务、大事务减少锁竞争。做好监控与日志故障可快速定位。定期备份故障时能快速恢复。

更多文章