目录
故障排查
日常实验环境
一、连接数过多(Too many connections)
原因:并发连接数超过max_connections
限制(默认151)
解决步骤:
- 临时调整:
SET GLOBAL max_connections=500;
- 永久修改:在
my.cnf
中设置max_connections=500
- 优化连接复用:使用连接池或线程池(如商业版的Thread Pool插件)
二、主从复制数据冲突(Last_SQL_Errno: 1062)
原因:从库误操作导致主键冲突
解决步骤:
- 检查冲突数据:
SHOW SLAVE STATUS\G
- 跳过错误:
SET GLOBAL sql_slave_skip_counter=1; START SLAVE;
- 彻底修复:重建从库或手动同步冲突数据
三、数据库拒绝连接(ERROR 2003)
原因:服务未启动或端口被拦截
解决步骤:
- 检查服务状态:
systemctl status mysqld
- 开放防火墙:
firewall-cmd --add-port=3306/tcp --permanent
- 验证网络连通性:
telnet <IP> 3306
四、访问权限拒绝(ERROR 1045)
原因:用户名/密码错误或权限不足
解决步骤:
- 重置密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
- 授权用户:
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';
- 刷新权限:
FLUSH PRIVILEGES;
五、查询性能低下
原因:未使用索引或复杂查询
解决步骤:
- 分析执行计划:
EXPLAIN SELECT...
- 添加缺失索引:
ALTER TABLE t ADD INDEX idx_col(column);
- 优化SQL:避免
SELECT *
,拆分子查询
六、表锁/行锁冲突
原因:长事务或未提交事务阻塞其他操作
解决步骤:
- 查看锁状态:
SHOW ENGINE INNODB STATUS\G
- 终止阻塞进程:
KILL <process_id>;
- 优化事务:缩短事务时长,避免大事务
七、磁盘空间不足
原因:日志文件或临时文件暴增
解决步骤:
- 清理日志:
PURGE BINARY LOGS BEFORE '2025-05-01';
- 调整日志大小:
innodb_log_file_size=1G
- 监控空间:设置
df -h
定时任务
八、配置文件错误
原因:参数错误或语法问题
解决步骤:
- 验证配置:
mysqld --verbose --help | grep -A1 "Default options"
- 逐段检查:使用
mysqld --validate-config
- 回滚配置:保留多版本
my.cnf
备份
九、备份恢复失败
原因:备份文件损坏或版本不兼容
解决步骤:
- 验证备份:
mysqlcheck -r <database>
- 分阶段恢复:先恢复结构再导入数据
- 使用物理备份工具:如Percona XtraBackup
十、内存溢出(OOM Killer触发)
原因:innodb_buffer_pool_size
设置过大
解决步骤:
- 计算合理值:
总内存 * 0.75 - 系统预留
- 动态调整:
SET GLOBAL innodb_buffer_pool_size=8G;
- 监控内存:
free -m
和cat /proc/meminfo
详细案例
一、连接数耗尽(案例升级版)
深层原因:
- 每个连接消耗约4MB内存,连接风暴导致OOM
- 应用层连接泄漏(未正确关闭连接)
详细解决步骤:
- 紧急处理:
mysql> SET GLOBAL max_connections=1000; -- 临时扩容 mysql> SHOW PROCESSLIST; -- 找出空闲连接 mysql> KILL <id>; -- 清理僵尸连接
- 永久优化:
- 在my.cnf添加:
max_connections=1000 thread_cache_size=100 -- 连接线程复用
- 在my.cnf添加:
- 代码层检查:
- 使用JDBC时确保
try-with-resources
自动关闭连接
- 使用JDBC时确保
二、主从复制数据不一致(技术细节)
根本原因分析:
- 从库写入导致GTID断点(
gtid_executed
与gtid_purged
冲突)
精准修复方案:
- 数据校验:
mysql> CHECKSUM TABLE master_db.table1, slave_db.table1;
- 重建复制:
# 主库锁表备份 mysqldump --master-data=2 --single-transaction -uroot -p dbname > backup.sql # 从库重置 mysql> STOP SLAVE; RESET SLAVE ALL; mysql> CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl_user', MASTER_PASSWORD='password', MASTER_AUTO_POSITION=1;
三、查询阻塞死锁(InnoDB引擎级分析)
锁等待原理:
- 事务A持有X锁未提交,事务B请求S锁被阻塞
诊断与解决:
- 查看锁依赖图:
mysql> SELECT * FROM performance_schema.events_waits_current; mysql> SELECT * FROM sys.innodb_lock_waits; -- 需要安装sys库
- 强制解锁:
mysql> SELECT * FROM information_schema.INNODB_TRX\G mysql> KILL <blocking_trx_id>;
四、磁盘I/O瓶颈(性能调优)
SSD优化参数:
[mysqld]
innodb_io_capacity=2000 # SSD建议值
innodb_io_capacity_max=4000
innodb_flush_neighbors=0 # SSD禁用相邻页刷新
监控命令:
$ iostat -xmt 1 # 查看await和%util
$ pt-diskstats # Percona工具监控
五、内存泄漏(专业诊断)
排查工具链:
- 检查内存分配:
valgrind --tool=memcheck --leak-check=full mysqld
- 分析内存碎片:
mysql> SHOW ENGINE INNODB STATUS\G # 关注BUFFER POOL AND MEMORY段落
六、紧急恢复流程(数据文件损坏)
innodb_force_recovery级别:
级别 | 作用 | 风险 |
---|---|---|
1 | 跳过损坏页 | 低 |
3 | 回滚事务 | 可能数据丢失 |
6 | 不执行redo日志 | 高 |
操作示例:
[mysqld] innodb_force_recovery=3
环境优化
一、CPU配置优化
- 选择高性能CPU
- 优先选择主频高、三级缓存大的处理器,高频CPU可加速复杂查询处理
- 多核配置适用于高并发场景,建议根据业务并发量选择核心数
- BIOS设置优化
- 关闭CPU节能模式(如C1E/C States),强制运行在性能模式
- 启用NUMA的Node Interleaving模式,避免内存访问不均衡问题
优化原因
-
高频CPU优势
- 单线程查询性能与主频直接相关,高频CPU可减少复杂SQL(如多表JOIN)的执行耗时
- 大三级缓存能降低内存访问延迟,尤其对频繁访问的索引数据效果显著
-
NUMA设置必要性
- 默认NUMA策略可能导致内存分配不均,某些CPU核心因远程内存访问产生额外延迟
- Node Interleaving模式使内存均匀分布,避免"内存墙"问题
二、内存配置优化
- 容量选择
- 确保内存容量足以容纳
innodb_buffer_pool_size
(建议占总内存60%-75%)及操作系统缓存需求 - 对于OLTP场景,推荐内存容量达到数据热集的2倍以上
- 确保内存容量足以容纳
- 性能调优
- 选择高频率内存条(如DDR4 3200MHz以上)
- 禁用Swap交换分区,避免磁盘I/O干扰(通过
vm.swappiness=0
实现)
核心逻辑
-
Buffer Pool设计原理
- InnoDB通过内存缓冲池缓存表数据和索引,足够大的缓冲池可将热数据完全保留在内存中
- 内存不足时会产生磁盘读(物理I/O),性能下降可达100倍以上
-
禁用Swap的机制
- 当物理内存不足时,Linux会将MySQL进程内存页交换到磁盘
- 交换操作引发磁盘I/O阻塞查询线程,且恢复内存时产生二次延迟
三、存储系统优化
- 存储设备选型
- 优先采用NVMe SSD或PCIe SSD,随机I/O性能相比HDD提升百倍以上
- 若预算有限,可选用SAS 15K RPM机械盘替代SATA盘
- RAID配置策略
- 采用RAID 10替代RAID 5,规避校验写入的性能损耗
- 配备带BBU(电池备份)的RAID卡,启用Write Back缓存策略提升写入性能
- 存储架构分离
- 操作系统、数据文件、日志文件需分布在不同物理磁盘上以降低I/O竞争
优化依据
-
SSD的革新性优势
- 随机I/O性能对比:NVMe SSD(100K+ IOPS) >> SATA SSD(50K IOPS) >> HDD(200 IOPS)
- 事务型负载(OLTP)中90%以上是随机I/O,SSD可降低UPDATE/DELETE操作的响应时间
-
RAID 10选择逻辑
- RAID 5的"写惩罚"现象:每次写入需计算校验位,实际写入量=原始数据量×4
- RAID 10通过镜像+条带化,写入性能接近单盘2倍,且故障恢复更快
四、网络配置优化
- 网卡选择
- 采用万兆网卡(10GbE)或更高带宽设备,减少网络传输延迟
- 协议优化
- 启用TCP协议参数调优(如增大
net.core.somaxconn
net.ipv4.tcp_max_syn_backlog
)
- 启用TCP协议参数调优(如增大
深层原因
- 万兆网络的价值
- 千兆网卡理论带宽125MB/s,实际传输中受协议开销影响仅能达到80-90MB/s
- 当执行大数据量查询(如全表扫描)时,网络可能成为瓶颈
五、硬件环境规划
- 服务器类型
- OLTP场景建议选用物理服务器,避免虚拟化层的性能损耗
- 冗余备份
- 关键业务需配置双电源、多网卡绑定(Bonding)等高可用方案
科学依据
- 物理服务器优势
- 虚拟化层的CPU调度和内存虚拟化会引入5-15%性能损耗
- 直接访问物理设备可避免虚拟存储(如Ceph/RBD)的I/O排队问题
六、配套调优措施(硬件相关)
- 文件系统配置
- 使用XFS文件系统,挂载参数添加
noatime,nodiratime,nobarrier
- 使用XFS文件系统,挂载参数添加
- I/O调度策略
- 设置磁盘调度算法为
deadline
或noop
(SSD场景推荐后者)
- 设置磁盘调度算法为
技术原理
-
XFS文件系统特性
- 动态inode分配避免ext4的inode数量限制问题
nobarrier
参数可禁用写入屏障,提升15-20%写入性能(需配合BBU RAID卡)
-
I/O调度算法差异
noop
算法避免SSD场景下的多余排序操作(SSD本身具有并行处理能力)deadline
算法为机械盘优化,防止某些I/O请求被"饿死"