以下是 MySQL 运维实战 中最常遇到的 10类问题 及其排查思路 + 解决方案(基于2024-2025年生产环境常见场景,按发生频率排序):
| 排名 | 问题类型 | 典型报错/现象 | 快速定位命令/视图 | 常见根本原因(Top3) | 推荐解决方案(优先级顺序) |
|---|---|---|---|---|---|
| 1 | 慢查询 / 高延迟 | 响应时间 > 1s,CPU不高但等待多 | SHOW PROCESSLIST + slow_query_log | 1. 缺少索引 2. 隐式转换 3. 大表全表扫描 | 1. 开启慢查询日志 + long_query_time=0.5 2. EXPLAIN ANALYZE / EXPLAIN FORMAT=JSON3. 加索引 / 改写SQL / 分表分区 |
| 2 | 连接数打满(Too many connections) | ERROR 1040 (00000): Too many connections | SHOW GLOBAL STATUS LIKE 'Threads_%'; | 1. 连接池配置过大 2. 慢查询堆积 3. 连接泄漏 | 1. 调高 max_connections(临时)2. 优化慢查询 3. 业务侧加连接池 + 设置合理超时 |
| 3 | 主从延迟严重 | Seconds_Behind_Master > 3600 | SHOW SLAVE STATUS\G | 1. 大事务 2. 从库SQL线程单线程瓶颈 3. 网络/IO瓶颈 | 1. 拆分大事务 2. 开启并行复制(binlog_transaction_dependency_tracking=WRITESET) 3. 升级从库硬件或读写分离 |
| 4 | 死锁(Deadlock found) | ERROR 1213 (40001): Deadlock found | SHOW ENGINE INNODB STATUS | 1. 事务内多表更新顺序不一致 2. 热点行更新 | 1. 统一加锁顺序 2. 降低事务粒度 3. 使用 SELECT ... FOR UPDATE 时加 NOWAIT / SKIP LOCKED |
| 5 | InnoDB缓冲池争用 / 脏页刷盘慢 | 写压力大,checkpoint lag大,fsync延迟高 | SHOW ENGINE INNODB STATUS → Log flushed up to / Last checkpoint at | 1. innodb_flush_log_at_trx_commit=1 + 高并发写 2. redo log太小 | 1. 调大 innodb_log_file_size(建议4-8GB/组)2. 考虑 innodb_flush_log_at_trx_commit=2(容忍1秒数据丢失) 3. 加NVMe盘或增大写缓冲 |
| 6 | 磁盘写满 / tmpdir满 | ERROR 1114 (HY000): The table is full | df -h + df -h /tmp | 1. ibtmp1文件无限增长 2. 临时表暴涨 | 1. 设置 innodb_temp_data_file_path 独立表空间2. 优化SQL减少临时表 3. 增大磁盘或清理 |
| 7 | MySQL崩溃 / 启动失败 | mysqld_safe A mysqld process already exists | ps -ef | grep mysqld + error log | 1. .pid文件残留 2. socket文件冲突 3. 数据文件损坏 | 1. 删除残留pid/socket文件 2. 检查error log最后几十行 3. 尝试 --tc-heuristic-recover=COMMIT / 回滚 |
| 8 | 高可用切换后只读 | super_read_only=ON 或 read_only=ON | SELECT @@read_only, @@super_read_only; | 1. GTID主从切换后未正确解除只读 2. 误操作 | 1. SET GLOBAL super_read_only=OFF; SET GLOBAL read_only=OFF;2. 检查 Orchestrator / MHA / VIP 脚本 |
| 9 | 认证插件问题(8.0+常见) | Authentication plugin ‘caching_sha2_password’ | 客户端连接报错 | 老客户端不支持caching_sha2_password | 1. 改回 mysql_native_password(临时)2. 升级客户端驱动 3. 推荐 caching_sha2_password + ssl |
| 10 | binlog 磁盘爆炸 | binlog目录占用几百GB甚至TB | du -sh /var/lib/mysql/binlog/* | 1. binlog过期时间过长 2. 未开启expire_logs_days | 1. 设置 binlog_expire_logs_seconds=604800(7天)2. 定期手动 PURGE BINARY LOGS3. 监控binlog目录使用率 |
运维排查常用“一键诊断”组合拳(建议做成脚本)
-- 状态汇总(最常用的一屏)
SHOW GLOBAL STATUS WHERE Variable_name IN (
'Threads_connected','Threads_running','Queries','Questions',
'Innodb_buffer_pool_reads','Innodb_buffer_pool_read_requests',
'Innodb_row_lock_waits','Innodb_row_lock_time_avg',
'Created_tmp_disk_tables','Created_tmp_tables',
'Slow_queries','Aborted_connects'
);
-- 当前正在执行的长事务/慢查询
SELECT * FROM information_schema.processlist
WHERE command NOT IN ('Sleep','Binlog Dump')
AND time > 10
ORDER BY time DESC LIMIT 10;
-- 索引缺失告警(MySQL 8.0+)
SELECT * FROM sys.schema_unused_indexes
ORDER BY object_name, index_name;
-- 表大小Top20 + 碎片
SELECT table_schema, table_name,
ROUND(data_length/1024/1024) AS data_MB,
ROUND(index_length/1024/1024) AS idx_MB,
ROUND(data_free/1024/1024) AS free_MB
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql','sys')
ORDER BY data_length + index_length DESC LIMIT 20;
2025年最值得关注的运维新趋势(简要)
- 慢查询治理 → AI辅助:很多公司已用大模型分析slow log + 执行计划,给出改写建议
- 连接管理:ProxySQL / MySQL Router + 连接池 → 彻底解决连接打满问题
- 并行复制 & WriteSet:MySQL 8.0+ 主从延迟大幅下降的杀手锏
- innodb_redo_log_capacity(8.0.30+):取代 innodb_log_file_size,更智能的redo管理
- Group Replication / InnoDB Cluster:逐步替代传统主从 + MHA 的方案
你当前最头疼的是哪一类问题?
是慢查询、连接数、主从延迟、死锁、磁盘、崩溃启动、还是其他?
告诉我具体现象/报错,我可以给你更精准的诊断步骤和应急方案。