MySQL 故障排查与优化

MySQL 故障排查与优化

一、日常故障排查思路

  1. 先看服务状态

    • 启动失败:查看错误日志 error.log,常见原因端口占用、配置错误、权限不足、磁盘满。
    • 无法连接:检查端口 3306、防火墙、bind-address、授权用户主机限制。
  2. 查看关键日志

    • 错误日志:记录启动、崩溃、严重异常。
    • 慢查询日志:定位低效 SQL。
    • 二进制日志:数据恢复、主从同步问题排查。
  3. 连接与权限类故障

    • Access denied:密码错误、主机未授权、用户不存在。
    • Too many connections:连接数超限,调大 max_connections 或优化连接复用。
  4. 锁等待与阻塞

    • 查看锁等待:show processlist;show engine innodb status;
    • 长事务未提交导致锁阻塞,需 kill 异常会话。
  5. 主从复制故障

    • 同步延迟:网络、大事务、从库性能不足。
    • 同步中断:主键冲突、语句执行错误、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_commit:1 强安全,2 性能高,0 最高性能。
  • 查询缓存
    • MySQL 8.0 已移除,5.7 建议关闭避免失效开销。

2. SQL 优化

  • 避免 select *,只查需要字段。
  • 避免 where 1=1 等无意义条件,避免隐式类型转换。
  • 少用 order by rand()in 大量值、深度子查询。
  • limit offset 分页优化:改为主键范围查询。
  • 使用 explain 分析执行计划,重点看 typekeyrowsExtra

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

四、典型故障场景

  1. 数据库突然卡顿

    • 长事务锁表 → 杀事务
    • 慢 SQL 耗尽 IO/CPU → 杀掉并优化
    • 磁盘 IO 100% → 检查是否有大量排序、临时表
  2. 数据库宕机重启

    • 查看错误日志定位崩溃原因
    • 检查 OOM、磁盘满、文件损坏
    • 必要时使用备份恢复
  3. 从库延迟严重

    • 大事务(如 delete 大量数据)
    • 从库配置过低、无索引
    • 并行复制参数未优化
  4. 磁盘空间暴涨

    • binlog 未清理 → 配置 expire_logs_days
    • 临时表、undo 空间异常
    • 大表无归档清理

五、优化总结

  1. 优先解决慢 SQL索引缺失,见效最快。
  2. InnoDB 缓冲池是性能核心,合理分配内存。
  3. 避免长事务、大事务,减少锁竞争。
  4. 做好监控与日志,故障可快速定位。
  5. 定期备份,故障时能快速恢复。
相关推荐
m0_746752304 分钟前
HTML5视频标签针对不同设备DPR的资源选择逻辑
jvm·数据库·python
2301_773553624 分钟前
c++怎么在Linux下获取文件被最后一次访问的精确纳秒时间【进阶】
jvm·数据库·python
是宇写的啊6 分钟前
MyBatis-3
数据库
gmaajt9 分钟前
CSS如何给按钮添加按下缩小的动画_利用-active配合transform
jvm·数据库·python
m0_7478545216 分钟前
CSS如何让响应式图片在容器内居中_利用background-position
jvm·数据库·python
笨鸟先飞的橘猫24 分钟前
Mysql——MVCC学习
数据库·学习·mysql
2401_8716965224 分钟前
CSS如何优化移动端CSS选择器性能_遵循BEM规范避免过长嵌套
jvm·数据库·python
是宇写的啊30 分钟前
MyBatis-2
数据库
2401_8836002530 分钟前
Cgo 回调中处理 const char- 参数的正确方法
jvm·数据库·python
m0_7375393735 分钟前
redis的安装
数据库·redis·缓存