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

目录

[1. MySQL单实例故障排查](#1. MySQL单实例故障排查)

[2. MySQL 主从故障排查](#2. MySQL 主从故障排查)

[3. MySQL 优化](#3. MySQL 优化)

[3.1 硬件方面](#3.1 硬件方面)

[3.2 MySQL 配置文件](#3.2 MySQL 配置文件)

[3.3 SQL 方面](#3.3 SQL 方面)


1. MySQL单实例故障排查

(1) 故障现象1

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/mysql.sock'(2)

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

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

(2) 故障现象2

ERROR 1045(28000):Access denied for user root'@ localhost' (usingpassword: NO)

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

**解决方法:**修改 my.cnf 主配置文件,在[mysqld]下添加 skip-grant-tables=on,重启数据库。

(3) 故障现象3

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

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

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

(4) 故障现象4

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

问题分析:

  • 服务器非正常关机,数据库所在空间已满,或一些其它未知的原因,对数据库表造成了损坏。
  • 可能是操作系统下直接将数据库文件拷贝移动,会因为文件的属组问题而产生这个错误.

解决方法:

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

    复制代码
    myisamchk -r 数据文件目录/数据表名. MYI;
  • 通过 phpMyAdmin 修复,phpMyAdmin 带有修复数据表的功能,进入到某一个表中后,点击"操作",在下方的"表维护"中点击"修复表"即可

(5) 故障现象5

ERROR 1129 (HY000): Host 'xxx.xxx.xxx.xxx'is blocked because of manyconnection errors;
unblock with mysqladmin flush-hosts'

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

解决方法:

使用 mysqladmin flush-hosts 命令清除缓存,命令如下:

mysqladmin -uroot -p -h IP flush-hosts

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

(6) 故障现象6

客户端报 Too many connections

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

解决方法:

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

复制代码
max connections =10000

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

复制代码
set GLOBAL max connections=10000;

(7) 故障现象7

Warning: World-writable config file ,/etc/my.cnf'is ignoredERROR! MySQL is running but PID file could not be found

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

解决方法:

复制代码
chmod 644 /et/my.cnf

(8) 故障现象8

InnoDB: Error: page 14178 log sequence number 29455369832InnoDB:is in the future! Current system log sequence number 29455369832

**问题分析:**innodb 数据文件损坏。

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

2. MySQL 主从故障排查

(1) 故障现象1

从库的 Slave_I0 Running 为NOThe slave l/0 thread stops because master and slave have equal MySQl serverids; these ids must be different for replication to work (or thereplicate-same-server-id option must be used on slave but this does notalways make sense; please check the manual before using it).

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

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

(2) 故障现象2

从库的 Slave l0 Running 为NO

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

解决方法一:

复制代码
mysql> stop slave;
mysq1> Set GLOBAL SQL SLAVE SKIP COUNTER=1:
mysgl> start slave;

解决方法二:

设置用户权限,设置从库只读权限

复制代码
set global read only=true;

(3) 故障现象3

Error initializing relay log position: I/0 error reading the header fromthe binary log

**分析问题:**从库的中继日志 relay-bin 损坏。

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

复制代码
mysq1>CHAN        GEMASTER        TO  MASTER LOG FILE='mysql-bin.xxx',MASTER LOG POS=xxx;  

3. MySQL 优化

3.1 硬件方面

服务器硬件,最主要的无非 CPU、内存、磁盘三大关键因素。

(1) 关于 CPU

CPU 对于 MySQL 应用,推荐使用 S.M.P.架构的多路对称 CPU。例如:可以使用两颗 Intel Xeon 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)硬盘专门作为数据库服务器使用。数据库的读写性能肯定会提高很多。

3.2 MySQL 配置文件

(1) 核心性能优化项

(2) 查询优化项

(3) 日志与监控

(4) InnoDB 高级优化

3.3 SQL 方面

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

(1) 准备用于测试的数据库和表

复制代码
#创建测试库
Create database test;
 
#创建用户表
Use test;
 
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    age INT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
 
 
#插入 10 万条测试数据(使用存储过程生成)
DELIMITER $$
CREATE PROCEDURE insert_users()
BEGIN
    DECLARE i INT DEFAULT 0;
    WHILE i < 100000 DO
        INSERT INTO users (name, email, age) 
        VALUES (CONCAT('user', i), CONCAT('user', i, '@example.com'), FLOOR(RAND() * 100));
        SET i = i + 1;
    END WHILE;
END$$
DELIMITER ;
 
select * from users;          ##当表里面的数据量非常庞大时,使用此语句查看会非常慢

(2) 使用explain对sql优化

复制代码
mysql> select * from users where name='user111';     
+--------+---------+---------------------+-----+---------------------+
| id     | name    | email               | age | created_at          |
+--------+---------+---------------------+-----+---------------------+
|    112 | user111 | [email protected] |  38 | 2025-05-09 08:16:12 |
| 100112 | user111 | [email protected] |  38 | 2025-05-09 08:17:00 |
+--------+---------+---------------------+-----+---------------------+
2 rows in set (0.04 sec)              ##普通查看数据的速度
mysql> explain select * from users where name='user111';
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | users | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 199578 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)      ##使用explain查看数据的速度

(3) 添加索引优化查询速度

复制代码
mysql> alter table users add index idx_name(name);   ##添加名为idx_name值为name的索引
Query OK, 0 rows affected (0.24 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> select * from users where name='user111';
+--------+---------+---------------------+-----+---------------------+
| id     | name    | email               | age | created_at          |
+--------+---------+---------------------+-----+---------------------+
|    112 | user111 | [email protected] |  38 | 2025-05-09 08:16:12 |
| 100112 | user111 | [email protected] |  38 | 2025-05-09 08:17:00 |
+--------+---------+---------------------+-----+---------------------+
2 rows in set (0.00 sec)              ##验证并观看查询时间
相关推荐
绝迹的星几秒前
MySQL与Redis一致性问题分析
数据库·redis·mysql
有时间要学习5 分钟前
MySQL——基本查询&&内置函数
mysql
Johny_Zhao10 分钟前
线下IDC数据中心迁移至阿里云详细方案
linux·网络·mysql·网络安全·信息安全·云计算·shell·数据迁移·yum源·系统运维·itsm
hkfkn23 分钟前
Sql刷题日志(day9)
数据库·sql
Musennn26 分钟前
SQL次日留存率计算精讲:自连接与多字段去重的深度应用
服务器·数据库·sql
悟能不能悟41 分钟前
Spring Boot多数据源配置的陷阱与终极解决方案
java·数据库·spring boot
是萝卜干呀1 小时前
Backend - Oracle SQL
数据库·sql·oracle·crud
2401_841003981 小时前
postgresql初体验
数据库·postgresql
再拼一次吧1 小时前
MySql进阶学习
数据库·学习·mysql
在未来等你1 小时前
高级SQL技巧:窗口函数与复杂查询优化实战
数据库·sql·性能优化·窗口函数·递归查询