8.MySQL故障排查与生产环境优化

要运用优化,首先要对mysql数据库的逻辑架构深入了解

一.MySQL的运行原理主要涉及以下几个关键部分

连接管理与客户端通信

• 当客户端请求连接到MySQL服务器时,服务器会验证客户端的身份和权限。

• 连接成功后,客户端可以向服务器发送SQL语句,服务器处理后将结果返回给客户端。

查询解析与优化

• 解析器:对客户端发送的SQL语句进行词法和语法分析,将其解析成内部的数据结构,检查语句的语法是否正确。

• 优化器:根据数据库的统计信息和索引情况,分析不同的执行计划,选择最优的方案来执行查询,以提高查询效率。

存储引擎

• MySQL支持多种存储引擎,如InnoDB、MyISAM等。不同的存储引擎有不同的特点和适用场景,负责数据的存储和检索。

• InnoDB支持事务、行级锁,适用于处理大量并发事务的场景;MyISAM不支持事务和行级锁,但查询性能较高,适用于读操作较多的场景。

缓存机制

• 查询缓存:用于缓存查询结果,如果相同的查询再次执行,直接从缓存中返回结果,避免重复执行查询,提高查询性能。

• 数据缓存:将经常访问的数据页缓存到内存中,减少磁盘I/O操作,提高数据访问速度。

事务处理

• 事务是一组SQL操作的集合,要么全部执行成功,要么全部回滚,以保证数据的一致性。

• InnoDB存储引擎通过使用日志(如redo log和undo log)来实现事务的ACID特性(原子性、一致性、隔离性、持久性)。

日志系统

• 错误日志:记录服务器启动、运行过程中的错误信息,有助于排查故障。

• 查询日志:记录所有执行的SQL语句,可用于分析查询性能和监控数据库活动。

• 二进制日志:记录对数据库的更改操作,用于数据恢复和主从复制。

二.案例实施

1.mysql单实例故障排查

(1)故障现象1

**问题分析:**以上这种情况一般都是数据库未启动、mysql配置文件未指定socket文件或者数据库端口被防火墙拦截导致。

**解决方法:**启动数据库或者防火墙开发数据库监听端口

(2)故障现象2

问题分析:密码不正确或者没有访问权限

解决方法:修改my.cnf主配置文件,在[mysqld]下添加skip-grant-tables=on,重启数据库,最后修改密码命令如下:

mysql15.7版本:

mysql>update mysql.user set authentication_string=password('123456') where user='root'

and Host='localhost';

mysql>flush privileges;

mysql18.0版本:

mysql>update mysql.user set authentication_string='' where user='root' and Host='localhost';

mysql>flush privileges;

mysql>alter user 'root'@'localhost' identified by '123456';

再删除刚刚添加的skip-grant-tables参数,重启数据库,使用新密码即可登录。重新授权,命令如下:

mysql15.7:

mysql>grant all on *.* 'root'@'mysql-server' identified by '123456';

mysql18.0:

mysql>create user 'root'@'mysql-server' identified by '123456';

mysql>grant all on *.* to 'root'@'mysql-server';

(3)故障现象3

在使用远程连接数据库时偶尔·会发生远程连接数据库很慢的问题。

**问题分析:**如果 MySQL 主机查询 DNS 很慢或是有很多客户端主机时会导致连接很慢.由于开发机器是不能够连接外网的,在进行MySQL连接时,DNS 解析是不可能完成的,从而也就明白了为什么连接那么慢了。

**解决方法:**修改ny.cnf配置文件,在[mysqld]下添加skip-name-resolve,重启数据库可以解决。注意在以后授权里面不能再使用主机名授权

(4)故障现象4

Can't open file: 'xxx forums.MYI'. (errno: 145)

问题分析: 服务器非正常关机,数据库所在空间已满,或一些其它未知的原因,对数据

库表造成了损坏。或可能是操作系统下直接将数据库文件拷贝移动,会因为文件的属组问题而产生这个错误.

解决方法:

**1.**可以使用下面的两种方式修复数据表(第一种方法仅适合独立主机用户)

**a.**使用 MySQL 自带的专门用户数据表检査和修复工具 myisamchk。一般情况下只有在命令行下面才能运行 myisamchk 命令。常用的修复命令为:

myisamchk -r 数据文件目录/数据表名.MYI;

b.通过 phpMyAdmin 修复,phpMyAdmin 带有修复数据表的功能,进入到某一个表中后,点击"操作",在下方的"表维护"中点击"修复表"即可

注意:以上两种修复方法在执行前一定要备份数据库

**2.**修改文件的属组(仅适合独立主机用户)

复制数据库文件的过程中没有将数据库文件设置为mysql运行的账号可读写(一般适用于Linux和FreeBSD用户)

(5)故障现象5

ERROR 1129 (HY000):Host 'xxx.xxx.xxx.xxx' is blocked because of many connection errors;

unblock with 'mysqladmin flush-hosts'

问题分析:由于mysql数据库的参数:max_connect_errors,其默认值是10.当大量(max_connect_errors)的主机去连接mysql,总连接请求超时了10次,新的连接就再也无法连接上mysql服务。同一个ip在短时间内产生太多中断的数据库连接而导致的阻塞

解决方法:

a.使用mysqladmin flush-hosts命令清除缓存

命令:mysqladmin -uroot -ppwd123 -h 192.168.241.48 flush-hosts

b.修改mysql配置文件,在[mysqld]下面添加max_connect_errors=1000,然后重启MySQL

(6)故障现象6

客户端报 Too many connections

**问题分析:**连接数超出Mysql的最大连接数限制

解决方法:

**a.**在my.cnf配置文件里面增大连接数,然后重启mysql服务

max_connections=10000

**b.**临时修改最大连接数,重启后不生效。需要在my.cnf里面修改配置文件,下次重启生效

set GLOBAL max_connections=10000;

(7)故障现象7

问题分析:mysql的配置文件/etc/my.cnf权限不对

解决方法:chmod 644 /etc/my.cnf

(8)故障现象8

InnoDB:Error:page 14178 log sequence number 2944539332

InnoDB:is in the future! Current system log sequence number 2944539332

问题分析:innidb数据文件损坏

解决方法:修改my.cnf配置文件,在[mysqld]下添加innodb_force_recovery=4,启动数据库后备份数据文件,然后去掉该参数,利用备份文件恢复数据。

2.MySQL主从故障排查

(1)故障现象1

问题分析:主库和从库的server-id值一样

解决方法:修改从库的server-id的值,修改为和主库不一样。修改后重启,再同步即可

(2)故障分析2

从库的Slave_IO_Running为NO

问题分析:造成从库线程为NO的原因会有很多,主要原因是主键冲突或者主库删除或更新数据,从库找不到记录,数据被修改导致。通常状态码报错有1007、1032、1062、1452等

解决方法:

a.

mysql>stop slave;

mysql>set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql>start slave;

**b.**设置用户权限,设置从库只读权限

set global read_only=true;

(3)故障现象3

Error initializing relay log position:I/O error reading the header from the binary log

**分析方法:**从库的中继日志relay-bin损坏

**解决方法:**手工修复,重新找到同步的binlog和pos点,然后重新同步即可

mysql>CHAN GEMASTER TO MASTER_LOG_FILE='mysql-bin.xxx',MASTER_LOG_POS=xxx;

3.MySQL优化

(1)硬件方面

1.关于CPU

CPU 对于 MySQL 应用,推荐使用 S.M.P.架构的多路对称 CPU。例如:可以使用两颗 IntelXeon 3.6GHz的 CPU。现在比较推荐用 4U 的服务器来专门做数据库服务器,不仅仅是针对于 MySQL。

2.关于内存

物理内存对于一台使用 MySQL 的 Database Server 来说,服务器内存建议不要小于 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_buffer_pool_size | InnoDB缓冲池大小,缓存数据和索引,直接影响读性能 | 设置为物理内存的50%~70% | 避免超过物理内存,防止系统交换(Swap) |
| innodb_log_file_size | 单个InnoDB重做日志文件大小,影响事务提交速度和崩溃恢复时间 | 建议1G~4G | 修改需停止MySQL,删除旧日志文件后重启 |
| innodb_flush_log_at_trx_commit | 控制事务日志刷新策略,平衡性能与数据安全 | 1(默认,完全持久化) 2(折中,每秒刷盘)0(高性能,高风险) | 高并发写入场景可设为2,但需容忍最多1秒数据丢失 |
| max_connections | 最大客户端连接数,避免连接耗尽 | 根据业务需求设置建议500~2000 thread_cache_size(如100)缓存线程 | 监控Threads_connected 和Threads_running调整 |
| tmp_table_size max_heep_table_size | 内存临时表大小上限,影响复杂查询(如GROUP BY、JOIIN) | 建议64M~256M,两者需一致 | 过小会导致磁盘临时表,降低性能;过大可能耗尽内存 |

2.查询优化项

|----------------------|-------------|---------------------|
| 参数 | 作用 | 建议配置 |
| query_cache_type | 查询缓存类型 | 默认,高并发下建议关闭 |
| sort_buffer_size | 排序操作缓冲区大小 | 2M~8M,过大浪费内存 |
| join_buffer_size | JOIN操作缓冲区大小 | 4M~16M,仅对无索引JOIN有效 |
| read_buffer_size | 顺序读缓冲区大小 | 2M~8M |
| read_rnd_buffer_size | 随机读缓冲区大小 | 4M~16M |

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/O能力(如刷新页面) | SSD建议2000~4000,HDD建议200~400 |
| innodb_flush_method | 控制数据文件与日志文件的刷新方式 | 0_DIRECT(默认,避免双缓冲) |
| innodb_thread_concurrency | InnoDB并发线程数限制 | 0(默认,自适应),高并发场景可设为CPU核数*2 |
| innodb_autoinc_lock_mode | 自增锁模式,影响插入性能 | 2(连续模式,高并发插入推荐) |

(3)SQL方面

SQL优化是确保数据库高效运行的关键,其核心在于通过减少资源消耗(如CPU、内存、磁盘 I/0)来提升查询响应速度,避免慢查询导致用户体验下降或系统崩溃。未优化的 SQL可能引发全表扫描、几余计算或锁竞争,尤其在数据量大或高并发场景下,会导致服务器负载飙升、响应延迟,甚至影响业务连续性(如交易超时)。通过索引调优、查询改写、执行计划分析等手段,可显著降低数据库压力,支撑业务规模扩展,同时控制硬件成本与运维复杂度,

相关推荐
大力水手偷吃菠菜变成米老鼠1 小时前
数据库 1.0.1
数据库
Lao A(zhou liang)的菜园1 小时前
Oracle中如何解决BUFFER BUSY WAITS
数据库·oracle
文牧之1 小时前
Oracle统计信息收集时的锁持有阶段
运维·数据库·oracle
昭阳~1 小时前
PostgreSQL架构
数据库·postgresql
quweiie1 小时前
mongodb管理工具的使用
数据库·mongodb
老李不敲代码1 小时前
榕壹云上门家政系统:基于Spring Boot+MySQL+UniApp的全能解决方案
spring boot·mysql·微信小程序·小程序·uni-app
JJ1M82 小时前
MYSQL笔记
数据库·笔记·mysql
小王努力学编程2 小时前
【数据库课程设计】网上投票管理系统
数据库·c++·qt·课程设计
夕泠爱吃糖3 小时前
MySQL
数据库·mysql
_oP_i3 小时前
python实现pdf转图片(针对每一页)
前端·数据库·python