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 缓冲池命中率
    • 锁等待、死锁次数
    • 主从延迟
  • 定期优化:
    • 清理冗余索引
    • 优化大表、分库分表
    • 清理历史数据,避免单表过大
相关推荐
sjsjsbbsbsn16 小时前
RAG 基础学习总结
java·数据库·学习
汽车仪器仪表相关领域16 小时前
Kvaser Memorator Light HS v2:单通道 CAN FD 便携记录仪,即插即用的故障诊断利器
运维·服务器·数据库·人工智能·功能测试·单元测试
Francek Chen16 小时前
【大数据存储与管理】NoSQL数据库:05 NoSQL的三大基石
大数据·数据库·分布式·nosql
人道领域16 小时前
【黑马点评日记】Redis分布式锁终极方案:Redisson全面解析(含源码解析)
java·数据库·redis·分布式·缓存
m0_7411733316 小时前
MySQL导入大SQL文件报错怎么办_拆分文件与优化系统参数
jvm·数据库·python
BullSmall16 小时前
Redis AOF 文件损坏报错:完整修复方案
数据库·redis·缓存
Amnesia0_016 小时前
磁盘文件系统
linux·运维·数据库
数据库知识分享者小北16 小时前
智能运维+多模型服务能力,阿里云 RDS AI 助手旗舰版正式上线!
运维·数据库·阿里云·阿里巴巴·rds·智能运维
m0_5887584816 小时前
如何解决Oracle启动ORA-00119错误_网络服务名与listener相关性
jvm·数据库·python
PSLoverS16 小时前
MySQL如何利用防火墙限制MySQL端口_使用iptables或安全组防御
jvm·数据库·python