MySQL 运维实战:常见问题排查与解决方案

以下是 MySQL 运维实战 中最常遇到的 10类问题 及其排查思路 + 解决方案(基于2024-2025年生产环境常见场景,按发生频率排序):

排名问题类型典型报错/现象快速定位命令/视图常见根本原因(Top3)推荐解决方案(优先级顺序)
1慢查询 / 高延迟响应时间 > 1s,CPU不高但等待多SHOW PROCESSLIST + slow_query_log1. 缺少索引
2. 隐式转换
3. 大表全表扫描
1. 开启慢查询日志 + long_query_time=0.5
2. EXPLAIN ANALYZE / EXPLAIN FORMAT=JSON
3. 加索引 / 改写SQL / 分表分区
2连接数打满(Too many connections)ERROR 1040 (00000): Too many connectionsSHOW GLOBAL STATUS LIKE 'Threads_%';1. 连接池配置过大
2. 慢查询堆积
3. 连接泄漏
1. 调高 max_connections(临时)
2. 优化慢查询
3. 业务侧加连接池 + 设置合理超时
3主从延迟严重Seconds_Behind_Master > 3600SHOW SLAVE STATUS\G1. 大事务
2. 从库SQL线程单线程瓶颈
3. 网络/IO瓶颈
1. 拆分大事务
2. 开启并行复制(binlog_transaction_dependency_tracking=WRITESET)
3. 升级从库硬件或读写分离
4死锁(Deadlock found)ERROR 1213 (40001): Deadlock foundSHOW ENGINE INNODB STATUS1. 事务内多表更新顺序不一致
2. 热点行更新
1. 统一加锁顺序
2. 降低事务粒度
3. 使用 SELECT ... FOR UPDATE 时加 NOWAIT / SKIP LOCKED
5InnoDB缓冲池争用 / 脏页刷盘慢写压力大,checkpoint lag大,fsync延迟高SHOW ENGINE INNODB STATUS → Log flushed up to / Last checkpoint at1. 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 fulldf -h + df -h /tmp1. ibtmp1文件无限增长
2. 临时表暴涨
1. 设置 innodb_temp_data_file_path 独立表空间
2. 优化SQL减少临时表
3. 增大磁盘或清理
7MySQL崩溃 / 启动失败mysqld_safe A mysqld process already existsps -ef | grep mysqld + error log1. .pid文件残留
2. socket文件冲突
3. 数据文件损坏
1. 删除残留pid/socket文件
2. 检查error log最后几十行
3. 尝试 --tc-heuristic-recover=COMMIT / 回滚
8高可用切换后只读super_read_only=ON 或 read_only=ONSELECT @@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_password1. 改回 mysql_native_password(临时)
2. 升级客户端驱动
3. 推荐 caching_sha2_password + ssl
10binlog 磁盘爆炸binlog目录占用几百GB甚至TBdu -sh /var/lib/mysql/binlog/*1. binlog过期时间过长
2. 未开启expire_logs_days
1. 设置 binlog_expire_logs_seconds=604800(7天)
2. 定期手动 PURGE BINARY LOGS
3. 监控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 的方案

你当前最头疼的是哪一类问题?
是慢查询、连接数、主从延迟、死锁、磁盘、崩溃启动、还是其他?
告诉我具体现象/报错,我可以给你更精准的诊断步骤和应急方案。

文章已创建 4138

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部