一、MySQL常见故障排查
1.单示例故障排查
故障现象1:无法连接数据库(ERROR 2002)
- 现象;
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/mysql.sock' (2)
- 原因分析:
- MySQL服务未启动。
- 配置文件未正确指定socket路径。
- 端口被防火墙拦截。
- 解决方法:
- 启动MySQL服务:systemctl start mysqld。
- 检查配置文件my.cnf中的socket路径是否与实际路径一致。
- 开放防火墙端口:
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
故障现象2:权限拒绝(ERROR 1045)
- 现象
- ERROR 1045 (28000): Access denied for user 'root'@'localhost'
- 原因分析:
- 密码错误。
- 用户权限配置错误。
- 解决方法:
- 临时跳过权限验证:
# 修改my.cnf,添加以下内容
[mysqld]
skip-grant-tables
重启MySQL后,直接登录并重置密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
2.删除skip-grant-tables配置并重启服务。
故障现象3:远程连接缓慢
- 现象:客户端远程连接数据库响应缓慢。
- 原因分析:
- MySQL反向解析客户端IP的DNS导致延迟。
- 解决方法:
在my.cnf中禁用DNS解析:
[mysqld]
skip-name-resolve
注意:此后授权需使用IP而非主机名。
故障现象4:表损坏(ERROR 145)
- 现象:
- Can't open file: 'xxx_forums.MYI' . (errno: 145)
- 原因分析:
- 服务器异常关机或磁盘空间不足导致表损坏。
- 文件权限问题。
- 解决方法:
1.使用myisamchk修复:
myisamchk -r /var/lib/mysql/db_name/table_name.MYI
2.检查文件权限:
chown -R mysql:mysql /var/lib/mysql
2.主从复制故障排查
故障现象1:主从Server ID冲突
- 现象:
- The slave I/O thread stops because master and slave have equal MySQL server ids
- 原因分析:主从库的server-id配置相同。
- 解决方法:
- 修改从库的my.cnf,设置唯一server-id,重启MySQL并重新配置同步。
故障现象2:主从数据不一致
- 现象:从库的Slave_SQL_Running为No,错误代码1032(键冲突)或1062(唯一键重复)。
- 解决方法:
- 跳过错误:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
故障现象3:中继日志损坏
- 现象:
- Error initializing relay log position:I/O error reading the header from the binary log
- 解决方法:
- 重新指定同步点
CHANGE MASTER TO
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=154;
START SLAVE;
二、生产环境优化策略
1.硬件与储存优化
- CUP:选择多核处理器(如lnter Xeon),支持高并发线程。
- 内存:
- 配置 innodb_buffer_pool_size为物理内存的70%(如64G内存设为45G).
- 避免内存溢出导致Swap交换。
- 磁盘:
- 使用SSD代替HDD,提升I/O性能。
- RAID配置推荐RAID 10(兼顾性能与冗余)。
2.MySQL配置参数优化
核心参数配置
[mysqld]
# 缓冲池与日志
innodb_buffer_pool_size = 40G
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 2 # 平衡性能与安全
# 连接管理
max_connections = 1000
thread_cache_size = 100
# 查询优化
tmp_table_size = 128M
max_heap_table_size = 128M
sort_buffer_size = 4M
join_buffer_size = 8M
# 主从复制
binlog_format = ROW
sync_binlog = 1
关键参数说明
- innodb_buffer_pool_size:
- lnnoDB引擎的核心缓存,缓存表数据与索引,减少磁盘I/O。
- innodb_flush_log_at_trx_commit:
- 1:完全持久化(安全,性能低)。
- 2:每秒刷盘(平衡选择)。
- max_connections:
- 根据业务峰值设置,避免连接耗尽(监控Threads_connected动态调整)。
3.SQL优化实战
索引优化
- 场景:用户表users按name字段查询缓慢。
- 问题分析:
EXPLAIN SELECT * FROM users WHERE name = 'user123';
-- 输出type=ALL(全表扫描)
- 解决方案
- 添加索引
ALTER TABLE users ADD INDEX idx_name (name);
优化后EXPLAIN显示type=ref,扫描行数从10万降至1行。
慢查询分析与处理
- 启用慢查询日志:
[mysqld]
slow_query_log = ON
long_query_time = 1 # 记录执行超过1秒的查询
log_queries_not_using_indexes = ON
- 分析慢日志:
mysqldumpslow -s t /var/log/mysql/slow.log
针对高频慢查询优化索引或重构SQL。
避免全表扫描
- 禁止SELECT *:仅查询所需字段。
- 使用覆盖索引:
-- 创建复合索引
ALTER TABLE orders ADD INDEX idx_customer_date (customer_id, order_date);
-- 查询命中索引
SELECT order_id FROM orders WHERE customer_id=100 AND order_date>'2023-01-01';
三、监控与维护最佳实践
1.监控工具推荐
- Prometheus + Grafana:实时监控QPS、连接数、缓冲池命中率。
- Percona Toolkit:分析慢查询、死锁和表碎片。
2.定期维护任务
- 表碎片整理:
OPTIMIZE TABLE large_table;
- 日志清理:
- 自动清理过期Binlog:
[mysqld]
expire_logs_days = 7
3.容灾与备份
- 全量备份:
mysqldump -uroot -p --single-transaction --all-databases > backup.sql
- 增量备份:
- 基于Binlog实现:
mysqlbinlog --start-datetime="2023-10-01 00:00:00" /var/lib/mysql/mysql-bin.00000* > incremental.sql
四、总结
MySQL故障排查与优化需从系统性视角出发:
- 快熟定位故障:通过日志、状态变量锁定问题根源。
- 分层优化:硬件资源分配——参数调优——SQL与索引优化。
- 预防性维护:定期监控、备份与性能分析,避免问题累积。
通过上述策略,可显著提升数据库的稳定性与性能,支撑高并发、大数据量的业务场景,同时降低运维成本与风险。