MySQL故障排查与优化笔记

一、常见故障排查思路

  1. 先看服务是否正常

    • 启动失败:查看错误日志 error log
    • 连接失败:端口、防火墙、权限、最大连接数
  2. 先定位瓶颈

    • CPU 高:慢查询、索引缺失、大量排序 / 分组
    • IO 高:大量随机 IO、无索引、大表全表扫描
    • 内存高:连接数过多、缓冲池设置不合理、大事务
  3. 常用排查命令

    sql

    复制代码
    -- 查看连接与状态
    SHOW PROCESSLIST;
    SHOW STATUS LIKE 'Threads%';
    SHOW STATUS LIKE 'Connections';
    
    -- 查看引擎状态(重点)
    SHOW ENGINE INNODB STATUS;
    
    -- 查看变量配置
    SHOW VARIABLES LIKE '%buffer_pool%';
    SHOW VARIABLES LIKE '%max_connections%';
    
    -- 查看慢查询是否开启
    SHOW VARIABLES LIKE 'slow_query_log%';

二、典型故障场景与处理

1. 连接不上 MySQL

  • 服务未启动:systemctl start mysqld
  • 端口被占用 / 防火墙拦截:关闭防火墙或开放 3306
  • 密码错误、IP 未授权:grant all on *.* to user@'%' identified by 'xxx';
  • 连接数满:max_connections 过小,或有大量 Sleep 连接

2. CPU 100%、数据库卡顿

  1. 执行 SHOW PROCESSLIST; 找到耗时 SQL
  2. 分析执行计划:EXPLAIN 你的SQL;
  3. 常见原因:
    • 无索引、索引失效
    • select *、大表 limit 偏移量过大
    • order by / group by 无索引
    • 大量子查询、in 过多值
  4. 处理:kill 阻塞会话 + 加索引 + 优化 SQL

3. 磁盘 IO 极高、查询慢

  • 全表扫描严重:EXPLAIN 中 type=ALL
  • InnoDB 缓冲池过小:innodb_buffer_pool_size 建议设为物理内存 50%~70%
  • 大量写入:redo log 太小、刷盘策略激进
  • 临时表磁盘化:order by/group by 无索引导致 Using temporary; Using filesort

4. 事务锁等待、死锁

  • 查看锁等待:SHOW ENGINE INNODB STATUS;
  • 死锁原因:
    • 事务过大、执行时间长
    • 更新同一行数据顺序不一致
  • 解决:
    • 缩短事务,避免长事务
    • 统一更新顺序
    • 避免 select ... for update 大范围锁定

5. 主从复制异常

  • 同步延迟:大事务、从库性能差、网络延迟
  • 同步中断:主键冲突、语句执行报错
  • 处理:
    • 跳过错误:set global sql_slave_skip_counter=1; start slave;
    • 重新导入数据、重建主从

三、SQL 优化核心原则

  1. 建索引
    • 经常 where、order by、group by、join 的字段建索引
    • 联合索引遵循最左前缀原则
    • 避免冗余索引、重复索引
  2. 避免索引失效
    • 不要对索引字段做函数、运算
    • 避免 !=、is not null、like '%xxx%'
    • 隐式类型转换会导致索引失效
  3. SQL 写法优化
    • 禁止 select *,只查需要字段
    • 大分页优化:where id > 10000 limit 100
    • 少用子查询,优先用 join
    • 避免 in 大量值,可用临时表或 join 替代

四、MySQL 配置优化(InnoDB)

ini

复制代码
# 连接数
max_connections = 1000

# InnoDB缓冲池(关键)
innodb_buffer_pool_size = 物理内存*0.6~0.7

# Redo Log
innodb_log_file_size = 1G
innodb_log_files_in_group = 2

# 刷盘策略(高性能)
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0

# 临时表
tmp_table_size = 64M
max_heap_table_size = 64M

# 慢查询
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /var/log/mysql/slow.log

五、日常监控与巡检

  • 慢查询日志分析:mysqldumpslow、pt-query-digest
  • 关键监控指标:
    • QPS、TPS
    • 连接数、慢查询数
    • InnoDB 缓冲池命中率
    • 锁等待、死锁次数
    • 主从延迟
  • 定期优化:
    • 清理冗余索引
    • 优化大表、分库分表
    • 清理历史数据,避免单表过大
相关推荐
SelectDB4 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系
数据库
这个DBA有点耶4 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
David猪大卫6 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
这个DBA有点耶6 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风6 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio7 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
蒸蒸yyyyzwd10 小时前
从后端面经学到的 3 个知识
笔记·学习
17岁的勇气10 小时前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
数据库急诊室_阿哲10 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
坤坤子吖11 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json