MySQL 作为被广泛使用的开源关系型数据库管理系统,虽然出现了众多数据库引擎,但是 MySQL 依然是 Web 应用的默认后台数据库系统。

MySQL 自开发之初就为优化 Web 应用而设计,现在被众多知名 Web 网站所采用。

如果网站后台使用了 MySQL 数据库,那么可以仔细阅读本文,因为本文包含了在使用 MySQL 数据库时遇到的常见问题故障处理总结,方便大家学习。

1] Can’t Connect to Local MySQL Server

这可能是在使用 MySQL 客户端连接数据库时遇到最多的错误提示,具体信息如下图所示:

图.1 MySQL 客户端不能连接服务器

这条命令连接本机的 MySQL 服务器,而本机 MySQL 服务并没有启动。想要确认本地 MySQL 服务是否启动,可以组合使用”ps”命令和”grep”命令来完成:

# ps xa | grep mysqld | grep -v mysqld

如果命令没有输出结果,则表示 MySQL 数据库服务器软件没有启动,所以 MySQL 客户端并不能成功连接服务器。使用以下命令就可以启动 MySQL 数据库:

# systemctl start mysql        #Debian/Ubuntu
# systemctl start mysqld       #RHEL/CentOS/Fedora
OR
# systemctl start mariadb      #Debian/Ubuntu
# systemctl start mariadb      #RHEL/CentOS/Fedora

查看 MySQL 服务器状态,使用如下命令:

# systemctl status mysql #Debian/Ubuntu 
# systemctl status mysqld #RHEL/CentOS/Fedora 
OR 
# systemctl status mariadb #Debian/Ubuntu 
# systemctl status mariadb #RHEL/CentOS/Fedora

图.2 查看 MySQL 数据库服务器状态

另外,如果服务器状态显示为运行”running”,而客户端依旧不能连接数据库服务器,则可以考虑 MySQL 侦听的端口被防火墙屏蔽或是 MySQL 侦听了其它端口,可以使用如下命令进行查看:

# netstat -tlpn | grep "mysql"

图.3 查看 MySQL 侦听商品信息

2] Can’t Connect to MySQL Server

另一种比较觉的连接报错代码为”(2003) Can’t connect to MySQL server on ‘server’ (10061)”,这表示连接请求被拒绝。出现这类报错时,主要是连接远端服务器而不是连接本机。

解决此类报错的方法与处理本地 MySQL 服务器连接故障类似,首先判断远端 MySQL 服务器是否启动,然后判断服务器侦听的端口是否被屏蔽以及侦听的端口是否是客户端连接的端口。

需要特别说明的是,如果 MySQL 服务器配置时侦听了”127.0.0.1:3306″端口而不是”0.0.0.0:3306″,则表示服务器只接受来自本机的连接请求,远程客户端则无法连接。

3] Access Denied Errors in MySQL

MySQL 一般采用帐户和密码进行接入认证,以保证只有通过认证的用户才可以访问数据库。虽然在连接数据库时会遇到各种各样的”Access Denied”错误,但是主要原因还是在于用户帐户没有被 MySQL 数据库赋予连接权限。

MySQL 允许创建连接并使用数据库的用户,如果出现接入被拒绝的情况,首先要查看该用户的所有权限,使用如下语句,就可以方便的查看用户的权限:

> SHOW GRANTS FOR 'root'@'localhost';

新创建的用户需要使用如下语句授权并使授权生效:

> grant all privileges on *.test_db to 'rultr'@'127.0.0.1';
> flush privileges;

另外,连接被拒绝也会因为之前的问题而造成,需要具体情况具体分析。

4] Lost Connection to MySQL Server

造成连接丢失的大部分原因在于网络状况不佳、连接超时以及数据块大于”max_allowed_packet”配置项。

如果网络本身质量不佳而造成的连接丢失,需要首先解决网络问题,提升网络质量,如果连接远端数据库服务器,则网络就显得尤为重要。

如果出现连接超时错误,特别是客户端在连接到数据库时,则需要修改数据库服务器”connect_timeout”参数;而出现由于大数据块传输造成的连接中断问题,可以修改数据库服务器”max_allowed_packet”参数。修改数据库服务器”/etc/my.cf”文件,修改”[mysqld]”配置块中的内容如下:

[mysqld]
connect_timeout=100
max_allowed_packet=500M

如果不能直接操作该配置文件,也可以在 MySQL 的命令行中执行如下语句达到同样效果:

> SET GLOBAL connect_timeout=100;
> SET GLOBAL max_allowed_packet=524288000;

5] Too Many MySQL Connections

如果客户端连接数据时报错提示”too many connections”时,则表示目前已经有其它客户端连接至数据库服务器,而连接到数据库的客户端数量已经超过了数据库的连接数限制(默认为151)。这个连接数由数据库服务器参数”max_connections”来设置。同样,可以修改数据库配置文件”/etc/my.cnf”,来提升数据库并发连接数:

[mysqld]
max_connections=1000

6] Out of Memory MySQL

如果客户端收到以下提示,则表示数据库服务器没有足够的内容来存储全部查询结果。

遇到这类提示,需要从两方面来考虑故障原因。首先要保证查询语句是正确的,因为查询结果过于庞大,的确会造成服务器内存耗尽。如果查询语句没有问题,则进行如下操作:

  • 如果使用 MySQL 客户端直接连接至服务器,则可以添加”–quick switch”参数保证快速显示查询结果
  • 如果使用 MyODBC 驱动连接至服务器,则可以将配置”Do not cache result”启用来保证内存资源

另一个非常好的办法是通过”MySQL Tuner”工具来帮助我们查找数据库问题,这个工具是一个十分有用的脚本,通过在 MySQL 服务器上运行,最后会对服务器给出优化建议。

7] MySQL 经常崩溃

如果遇到 MySQL 经常崩溃,需要判断是 MySQL 数据库服务器不稳定还是客户端问题。可以肯定的是,大多数数据库崩溃都源于数据文件或索引文件。

可以通过如下命令查看 MySQL 数据库状态:

# systemctl status mysql       #Debian/Ubuntu
# systemctl status mysqld      #RHEL/CentOS/Fedora

当然,也可以通过”mysqladmin”工具来显示 MySQL 数据库的详细运行信息:

# mysqladmin version -p

图.4 使用 mysqladmin 工具显示服务器信息

当然,也可以配置数据库服务器开启调试模式,然后再打开一个命令窗口,执行如下命令查看调试信息:

# mysqladmin -i 5 status
OR
# mysqladmin -i 5 -r status

MySQL 数据库故障处理的总结

虽然我们了解了一些简单的 MySQL 数据库故障处理办法,但这些在实际工作中就会显得远远不够。而处理故障的最基本问题是了解系统问题倒底意味什么。

我们怎么能够了解这些呢,做好以下几点,就会使一切变得较为轻松:

  • 首先,也是最重要的步骤就是查看 MySQL 的日志文件,通常会存储在”/var/log/mysql/”目录中,可以使用”tail”命令来了解日志详情
  • 如果 MySQL 服务启动异常,则可以使用”systemctl -xe”命令来了解故障详细信息
  • 如果在 MySQL 日志文件中查找不到原因,也可以查看系统日志”/var/log/message”,或许可以找到问题的端倪
  • 使用系统工具,诸如”mytop”、”glances”、”top”、”ps”以及”htop”等,方便定位故障
  • 如果 MySQL 服务进程出问题,可以使用管理工具执行命令”myadmin -u root ping”或”myadmin -u root processlist”来获取相应响应
  • 最后,如果判断故障为客户端原因而非 MySQL 服务器问题,则只须查找客户端问题即可

发表评论

您的电子邮箱地址不会被公开。