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 缓冲池命中率
    • 锁等待、死锁次数
    • 主从延迟
  • 定期优化:
    • 清理冗余索引
    • 优化大表、分库分表
    • 清理历史数据,避免单表过大
相关推荐
微学AI8 分钟前
不让每一步都调用最贵模型:用蓝耘智能路由改造自主式研究 Agent
数据库·人工智能·蓝耘
yjb.gz12 分钟前
Oracle19 RAC查看集群状态及磁盘空间情况(巡检)
数据库
钝挫力PROGRAMER29 分钟前
开发踩坑记:MyBatis selectKey、空 SQL
数据库·sql·mybatis
JosieBook36 分钟前
【数据库】MySQL 实战精通系列 · 第6篇:InnoDB 存储引擎、日志与崩溃恢复
数据库·mysql
an12321211 小时前
ARM嵌入式学习笔记:SPI通信协议详解
arm开发·笔记·学习
杨云龙UP1 小时前
TDengine 3.4.2.8 Community 三节点三副本生产集群部署实战(DNode/MNode/taosAdapter/Explorer)
大数据·linux·运维·数据库·tdengine·时序库
梦帮科技2 小时前
领域认知知识库图谱注入:从双式记账图网络到高质量问答对自动化合成流水线
运维·网络·数据库·人工智能·矩阵·架构·自动化
Long long ago.2 小时前
vastbase数据库运行sql宕机重启解决
数据库·sql
SelectDB技术团队2 小时前
一条日志两套引擎的账:把 Elasticsearch 检索与分析合并到同一份数据的落地写法
大数据·数据库·elasticsearch·搜索引擎·全文检索·日志·apache doris
数据库百宝箱2 小时前
rum&gin索引对比
java·数据库·gin