一、基础信息
1. 实验环境
-
数据库版本:MySQL 8.0
-
架构:1 台单实例 + 2 台主从复制环境
-
用途:模拟生产故障、验证优化方案
2. MySQL 逻辑架构(四层)
-
连接层
-
处理客户端连接、授权认证、权限校验
-
提供线程池、SSL 安全连接
-
-
服务层
-
SQL 接口、查询缓存、SQL 解析与优化
-
实现跨存储引擎功能(存储过程、函数等)
-
-
存储引擎层
-
负责数据存储与提取
-
可按需选择(InnoDB、MyISAM 等)
-
-
数据存储层
- 数据落地文件系统,与存储引擎交互
二、单实例常见故障 + 原因 + 解决方法(完整版)
-
ERROR 2002:无法通过 socket 连接 MySQL
-
原因:数据库未启动、socket 路径错误、防火墙拦截端口
-
解决:启动 MySQL;开放 3306 端口;检查 my.cnf socket 配置
-
-
ERROR 1045:Access denied 密码 / 权限错误
-
原因:密码错误、用户无权限
-
解决:
-
my.cnf [mysqld] 加
skip-grant-tables=on -
重启 MySQL
-
MySQL 8.0 清空密码并重置:
sqlUPDATE mysql.user SET authentication_string='' WHERE user='root' AND Host='localhost'; FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; -
删除 skip-grant-tables,重启
-
-
-
远程连接 MySQL 极慢
-
原因:MySQL 反向 DNS 解析耗时
-
解决:my.cnf 加
skip-name-resolve,重启
-
-
表损坏 errno:145
-
原因:异常关机、磁盘满、文件属组错误
-
解决:
-
命令行:
myisamchk -r 表文件.MYI -
工具:phpMyAdmin → 操作 → 修复表
-
修复前务必备份
-
-
-
Host 被阻塞(连接错误次数超限)
-
原因:
max_connect_errors默认 10,超限 IP 被拉黑 -
解决:
-
临时:
mysqladmin flush-hosts -
永久:my.cnf 调大
max_connect_errors=1000
-
-
-
Too many connections 连接数超限
-
原因:超过
max_connections -
解决:
-
临时:
set GLOBAL max_connections=10000; -
永久:my.cnf 设置
max_connections=10000
-
-
-
配置文件权限警告 + PID 找不到
原因:/etc/my.cnf 权限过大 解决:
chmod 644 /etc/my.cnf -
InnoDB 日志序列号错误(数据文件损坏)
-
原因:InnoDB 数据文件异常
-
解决:
-
my.cnf 加
innodb_force_recovery=4 -
启动并全量备份数据
-
去掉参数,用备份恢复
-
-
三、主从复制常见故障 + 原因 + 解决
-
Slave_IO_Running = NO(server-id 冲突)
-
原因:主从 server-id 相同
-
解决:修改从库 server-id,重启,重新同步
-
-
Slave_SQL_Running = NO(数据不一致 / 主键冲突)
-
原因:1007/1032/1062/1452 等错误,主从数据不一致
-
解决:
sqlstop slave; set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave;从库设只读:set global read_only=true;
-
-
中继日志损坏(I/O error reading binlog header)
原因:relay-bin 日志损坏
解决:重新指定主库 binlog 文件名与 pos 点,重新同步
四、生产环境优化(硬件 + 配置 + SQL)
1. 硬件优化
-
CPU:多路对称 SMP 架构,专用数据库服务器
-
内存:≥4GB,推荐 32GB 以上
-
磁盘
-
SAS 15000 转 + RAID0+1
-
优先 SSD,禁用 RAID5
-
提升 I/O 是 MySQL 性能关键
-
2. MySQL 8.0 配置优化(my.cnf 核心参数)
(1)核心性能参数
| 参数 | 作用 | 推荐值 | 注意 |
|---|---|---|---|
| innodb_buffer_pool_size | InnoDB 数据 / 索引缓存 | 内存 50%~70%(64G→40G) | 不超物理内存 |
| innodb_log_file_size | 重做日志大小 | 2G | 修改需删旧日志重启 |
| max_connections | 最大连接数 | 1000~10000 | 按并发调整 |
| thread_cache_size | 连接线程缓存 | 100 | 减少连接开销 |
| tmp_table_size/max_heap_table_size | 内存临时表 | 128M | 两者必须相等 |
(2)查询缓冲区
-
sort_buffer_size:4M
-
join_buffer_size:8M
-
query_cache_type:OFF(8.0 已移除)
(3)日志与监控
-
slow_query_log = ON
-
long_query_time = 1~2 秒
-
binlog_format = ROW(主从一致性高)
-
expire_logs_days = 7~14
-
log_error 指定错误日志路径
(4)InnoDB 高级优化
-
innodb_io_capacity:SSD=2000~4000;HDD=200~400
-
innodb_flush_method = O_DIRECT
-
innodb_thread_concurrency = 0(自适应)
-
innodb_autoinc_lock_mode = 2(高并发插入)
3. SQL 优化(核心方法)
-
工具 :
EXPLAIN分析执行计划 -
关键字段
-
type:避免 ALL(全表扫描),优先 ref/range
-
key:是否命中索引
-
rows:扫描行数越少越好
-
Extra:避免 Using temporary、Using filesort
-
-
优化步骤
-
用 EXPLAIN 查看全表扫描 SQL
-
给高频查询字段建索引
-
再次 EXPLAIN 验证索引生效
-
五、完整优化总结
MySQL 优化是三层联动:
-
硬件层:大内存 + SSD + 合理 RAID,提供性能底座
-
配置层:聚焦 InnoDB 缓冲池、日志、I/O、连接数
-
SQL 层:用 EXPLAIN 诊断,建索引,消除慢查询