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 分析执行计划,重点看 type、key、rows、Extra。

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. 定期备份,故障时能快速恢复。
相关推荐
心梦缘-雪雁1 小时前
SQL Server 查询数据存在哪个表里
数据库
lusklusklusk2 小时前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
GeW2 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
SelectDB2 小时前
Doris Arrow Flight SQL 高速读取协议实战:与 Snowflake 客户端取数链路对照
大数据·数据库·数据分析
曼岛_2 小时前
[图解密码学]第4章 古典密码
java·数据库·密码学
瀚高PG实验室3 小时前
HGDB V9.0.5 .pgpass 免密登录提示 IsEncryptNon-base64 encoding 警告处理
数据库·postgresql·瀚高数据库
龙腾AI白云4 小时前
大模型检索增强生成(RAG)的技术原理与架构设计
数据库·python·机器学习·知识图谱
KaiwuDB4 小时前
KaiwuDB 运维实战06:数据库备份与恢复:从理论到实战
运维·数据库·时序数据库·kaiwudb
数字新视界4 小时前
空调控制器AIRC800的智能化管理与应用实践
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
学IT的周星星5 小时前
LangGraph:用「流程图」的方式编排 Agent
数据库·人工智能·大模型·llm·流程图·agent