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 极高、查询慢

  • 全表扫描严重:EXPLAINtype=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. 建索引
    • 经常 whereorder bygroup byjoin 的字段建索引
    • 联合索引遵循最左前缀原则
    • 避免冗余索引、重复索引
  2. 避免索引失效
    • 不要对索引字段做函数、运算
    • 避免 !=is not nulllike '%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 缓冲池命中率
    • 锁等待、死锁次数
    • 主从延迟
  • 定期优化:
    • 清理冗余索引
    • 优化大表、分库分表
    • 清理历史数据,避免单表过大
相关推荐
光泽雨2 小时前
mysql外键
数据库·mysql
惺忪97982 小时前
Redis安装与启动
数据库·redis·缓存
|华|2 小时前
PostgreSQL日常维护
数据库·postgresql
APguantou2 小时前
NCRE-三级数据库技术-第9章-安全管理
数据库·安全·sqlserver
计算机学姐2 小时前
基于SpringBoot的高校实验室预约管理系统
java·spring boot·后端·mysql·spring·信息可视化·tomcat
&&Citrus2 小时前
【CPN 学习笔记(三)】—— Chap3 CPN ML 编程语言 上半部分 3.1 ~ 3.3
笔记·python·学习·cpn·petri网
lzhdim2 小时前
SQL 入门 9:SQL 高级子查询:ANY、EXISTS 与多位置应用
java·开发语言·数据库·sql·mysql
曾凡宇先生2 小时前
mysql连接问题
数据库
jwt7939279372 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql