MySQL故障排查域生产环境优化
目录
一,案例实施
1,MySQL单实例故障排查
(1)故障现象1
(2)故障2
(3)故障3
二,MySQL优化
1,硬件方面
(1)关于CPU
(2)关于内存
(3)关于磁盘
2,MySQL配置文件
(1)核心性能优化项
(2)查询优化项
(3)日志与监控
(4)InnoDB高级优化
(5)示例配置片段(my.cnf)
3,sql方面
(1)创建测试表并插入数据
(2)使用EXPLAIN进行SQL优化步骤及实验验证
(3)添加索引
(4)优化后查询及EXPLAIN分析
一,案例实施
1,MySQL单实例故障排查
(1)故障现象1
问题分析:以上这种情况一般都是数据库未启动、mysql配置文件未指定socket文件或者数据库端口被防火墙拦截导致。
解决方法:启动数据库或者防火墙开放数据库监听端口。
(2)故障2
问题分析:密码不正确或者没有权限访问。
解决方法:修改 my.cnf 主配置文件,在[mysqld]下添加 skip-grant-tables=on,重启数据库。最后修改密码命令如下。
忘记密码时(18.0版)实例
先进入/etc/my.cnf配置文件中添加
(跳过密码认证,直接登录MySQL)
登录MySQL后写入以下内容,重新更改密码
更改密码成功
(3)故障3
清除缓存
二,MySQL优化
1,硬件方面
说到服务器硬件,最主要的无非CPU、内存、磁盘三大关键因素
(1)关于CPU
CPU对于MySQL应用,推荐使用S.M.P.架构的多路对称CPU。例如:可以使用两颗IntelXeon3.6GHz的CPU。现在比较推荐用4U的服务器来专门做数据库服务器,不仅仅是针对于MySQL。
(2)关于内存
物理内存对于一台使用MySQL的DatabaseServer来说,服务器内存建议不要小于2GB,推荐使用4GB以上的物理内存。不过内存对于现在的服务器而言可以说是一个可以忽略的问题,工作中遇到了高端服务器基本上内存都超过了32G。
(3)关于磁盘
磁盘寻道能力(磁盘I/0)。以目前市场上普遍高转速SAS硬盘(15000转/秒)为例,这种硬盘理论上每秒寻道15000次,这是物理特性决定的,没有办法改变。 MySQL每秒钟都在进行大量、复杂的查询操作,对磁盘的读写量可想而知。所以通常认为磁盘I/0是制约 MySQL性能的最大因素之一,通常是使用RAID-0+1 磁盘阵列,注意不要尝试使用RAID-5,MYSQL在RAID-5 磁盘阵列上的效率并不高。如果不考虑硬件的投入成本,也可以考虑固态(SSD)硬盘专门作为数据库服务器使用。数据库的读写性能肯定会提高很多。
2,MySQL配置文件
(1)核心性能优化项
参数 | 作用 | 建议配置 | 注意事项 |
innodb_log_buffer_size | InnoDB 日志缓冲区大小,用于缓存事务日志,减少磁盘 I/O 操作 | 一般设置为 16M - 64M ,如 32M | 过小可能导致频繁的日志写入磁盘操作,影响性能;过大则浪费内存 |
query_cache_size | 查询缓存大小,缓存查询结果,相同查询可直接从缓存获取结果 | 根据系统情况,可尝试设置为几百兆,如 256M,但在高并发写场景下可能效果不佳 | MySQL 8.0 已弃用该功能;在写操作频繁时,维护查询缓存开销大,可能降低性能 |
sort_buffer_size | 每个线程用于排序操作的缓冲区大小 | 一般设置为 256K - 2M ,如 1M | 设置过大会浪费内存,尤其在高并发场景下;设置过小可能导致排序操作性能低下,出现临时文件排序 |
read_buffer_size | 顺序读取数据时的缓冲区大小 | 通常设置为 64K - 1M ,如 256K | 可根据顺序读取数据量和频率调整,不合理设置会影响顺序读性能 |
join_buffer_size | 用于连接操作(JOIN)的缓冲区大小 | 对于简单连接,可设置为 256K - 1M;复杂连接可适当增大,如 2M - 4M | 设置不当会影响连接查询性能,且高并发时过大设置会占用过多内存 |
(2)查询优化项
参数 | 作用 | 建议配置 |
query_cache_type | 查询缓存类型(MySQL8.0已移除,旧版本慎用) | 0FF(默认,高并发下建议关闭). |
sort_buffer_size | 排序操作缓冲区大小。 | 2M~8M,过大浪费内存(如4M)。 |
join_buffer_size | JOIN 操作缓冲区大小。 | 4M~16M,仅对无索引JOIN有效(如 8M)。 |
read_buffer_size | 顺序读缓冲区大小。 | 2M~8M(如4M)。 |
read_rnd_buffer_ size | 随机读缓冲区大小。 | 4M~16M(如8M) |
(3)日志与监控
参数 | 作用 | 建议配置 |
slow_query_log | 启用慢查询日志,记录执行时间长的SQL. | ON |
long query_ time | 定义慢查询值 | 1~2(根据业务容忍度调整)。 (秒)。 |
log_error | 错误日志路径,用指于故障排查。 | 指定路径 (如/var/log/mysql/error.log)。 |
binlog_format | 二进制日志格式(主从复制依赖)。 | ROW(推荐,数据一致性高)。 |
expire logs_days | 自动清理旧的二进制日志天数。 | 7~14(根据备份策略调整)。 |
(4)InnoDB高级优化
参数 | 作用 | 建议配置 |
innodb _io_capacity | InnoDB 后台任务的能力I/0 (如刷新脏页)。 | SSD 建议 2000~4000,HDD 建议:200~400。 |
innodb_flush_ method | 控制数据文件与日志文件的刷新方式。, | 0_DIRECT(默认,避免双缓冲)。 |
innodb _hread_ concurrency | InnoDB并发线程数限制。 | 0(默认,自适应),高并发场景可设为 CPU 核数*2。 |
innodb_autoinc_ lock_mode | 自增锁模式,影响插 入性能。 | 2(连续模式,高并发插入推 荐)。 |
(5)示例配置片段(my.cnf)
物理资源32核CPU、64G内存、500GSSD
等等
3,sql方面
SQL优化是确保数据库高效运行的关键,其核心在于通过减少资源消耗(如CPU、内存、磁盘I/0)来提升查询响应速度,避免慢查询导致用户体验下降或系统崩溃。未优化的SQL可能引发全表扫描、冗余计算或锁竞争,尤其在数据量大或高并发场景下,会导致服务器负载飙升、响应延迟,甚至影响业务连续性(如交易超时)。通过索引调优、查询改写、执行计划分析等手段,可显著降低数据库压力,支撑业务规模扩展,同时控制硬件成本与运维复杂度。
(1)创建测试表并插入数据
添加十万条测试数据
(2)使用EXPLAIN进行SQL优化步骤及实验验证
EXPLAIN是MySQL中用于分析SQL执行计划的工具,通过模拟查询执行过程输出关键信息(如访问类型type、使用索引 key、预估扫描行数rows、额外操作Extra 等),帮助开发者识别全表扫描、索引失效等性能瓶颈,从而指导优化方向(如添加索引、改写查询或调整表结构),是提升数据库效率不可或缺的诊断手段。
EXPLAIN 用于显示MySQL如何执行一条SQL语句,关键字段如下:
字段 | 说明 | 优化关注点 |
id | 查询序列号,相同id为同一执行层,不同id按序执行询) | (如子查复杂查询的嵌套层级。 。 |
select_type | 查询类型(SIMPLE、PRIMARY、SUBQUERY、DERIVED等)。 | 识别子查询或临时表操作, |
table | 访问的表名或别名。 | 确认查询涉及的表 |
type | 访问类型,性能从优到劣system>const>eq ref>ref range >index>ALL. | 避免ALL(全表扫描),优先优化为ref或range。 |
possible_ keys | 可能使用的索引。 | |
rows | 实际使用的索引。预估扫描的行数。 | 确认是否命中最佳索引。行数越少,查询效率越高 |
Extra | 附加信息(如Using whereUsingUsingindex文件排序)。temporary等)。 | 发现潜在性能问题(如临时 |