解决 MySQL 常见错误的有用技巧
MySQL是Oracle旗下广泛使用的开源关系数据库管理系统 ( RDMS ) 。多年来,它一直是基于 Web 的应用程序的默认选择,与其他数据库引擎相比,它仍然很受欢迎。
另请阅读:如何在 RHEL/CentOS 和 Fedora 上安装最新的 MySQL
MySQL是针对 Web 应用程序进行设计和优化的,它是Facebook、Twitter、Wikipedia、YouTube等许多基于 Web 的应用程序不可或缺的一部分。
您的网站或 Web 应用程序是否由MySQL提供支持?在这篇详细的文章中,我们将解释如何排除MySQL数据库服务器中的问题和常见错误。我们将描述如何确定问题的原因以及如何解决这些问题。
1.无法连接到本地 MySQL 服务器
MySQL 中常见的客户端到服务器连接错误之一是“ ERROR 2002 (HY000): 无法通过套接字‘/var/run/mysqld/mysqld.sock’(2) 连接到本地 MySQL 服务器”。
此错误表明主机系统上没有运行MySQL服务器,或者在尝试连接服务器时(mysqld)
指定了错误的 Unix 套接字文件名或TCP/IP端口。
通过使用ps 命令和grep 命令mysqld
一起检查数据库服务器主机上命名的进程来确保服务器正在运行,如图所示。
$ ps xa | grep mysqld | grep -v mysqld
如果上述命令没有输出,则表示数据库服务器未运行。因此客户端无法连接到它。要启动服务器,请运行以下systemctl 命令。
$ sudo systemctl start mysql #Debian/Ubuntu $ sudo systemctl start mysqld #RHEL/CentOS/Fedora
要验证MySQL服务状态,请使用以下命令。
$ sudo systemctl status mysql #Debian/Ubuntu $ sudo systemctl status mysqld #RHEL/CentOS/Fedora
从上述命令的输出来看,MySQL服务已失败。在这种情况下,您可以尝试重新启动它并再次检查其状态。
$ sudo systemctl restart mysql $ sudo systemctl status mysql
此外,如果服务器正在运行,如以下命令所示,但您仍然看到上述错误,那么您还应该验证TCP/IP端口是否被防火墙或任何端口阻止服务阻止。
$ ps xa | grep mysqld | grep -v mysqld
要找到服务器正在监听的端口,请使用netstat命令,如图所示。
$ sudo netstat -tlpn | grep "mysql"
2.无法连接到MySQL服务器
另一个常见的连接错误是“ (2003) 无法连接到‘服务器’ (10061) 上的 MySQL 服务器”,这意味着网络连接被拒绝。
在这里,首先检查系统上是否有MySQL服务器在运行,如上所示。还要确保服务器已启用网络连接,并且您用于连接的网络端口是服务器上配置的端口。
尝试连接到 MySQL 服务器时可能遇到的其他常见错误包括:
ERROR 2003: Can't connect to MySQL server on 'host_name' (111) ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
这些错误表明服务器可能正在运行,但是您尝试使用与服务器正在监听的TCP/IP端口、命名管道或 Unix 套接字文件不同的端口、命名管道或 Unix 套接字文件进行连接。
3. MySQL 中的访问被拒绝错误
在MySQL中,用户帐户是根据用户名和用户可以连接到服务器的客户端主机来定义的。此外,帐户还可能具有身份验证凭据,例如密码。
尽管“拒绝访问”错误的原因有很多种,但其中一个常见原因与服务器允许客户端程序在连接时使用的 MySQL 帐户有关。它表示连接中指定的用户名没有访问数据库的权限。
MySQL 允许创建帐户,使客户端用户可以连接到服务器并访问服务器管理的数据。在这方面,如果您遇到拒绝访问错误,请检查用户帐户是否被允许通过您正在使用的客户端程序连接到服务器,以及可能的连接来自的主机。
SHOW GRANTS
您可以通过运行如下所示的命令来查看给定帐户具有哪些权限。
> SHOW GRANTS FOR 'example'@'localhost';
您可以使用 MySQL shell 中的以下命令将特定数据库上的特定用户权限授予远程 IP 地址。
> grant all privileges on *.test_db to 'example'@'192.168.0.100'; > flush privileges;
此外,访问被拒绝错误也可能是由于连接 MySQL 的问题造成的,请参阅前面解释的错误。
4. 与 MySQL 服务器失去连接
您可能由于以下原因之一遇到此错误:网络连接不良、连接超时或BLOB值大于max_allowed_packet的问题。如果出现网络连接问题,请确保您的网络连接良好,尤其是在访问远程数据库服务器时。
如果是连接超时问题,特别是当MySQL尝试使用初始连接服务器时,请增加connect_timeout参数的值。但是,如果BLOB 值大于max_allowed_packet,则需要在/etc/my.cnf配置文件的或部分中为max_allowed_packet设置更高的值,如下所示。[mysqld]
[client]
[mysqld] connect_timeout=100 max_allowed_packet=500M
如果您无法访问MySQL配置文件,则可以使用 MySQL shell 中的以下命令设置此值。
> SET GLOBAL connect_timeout=100; > SET GLOBAL max_allowed_packet=524288000;
5. MySQL 连接过多
如果MySQL客户端遇到“连接过多”错误,则意味着所有可用连接均被其他客户端使用。连接数(默认为151)由系统变量控制;您可以通过增加其值来解决这个问题,以在/etc/my.cnfmax_connections
配置文件中允许更多连接。
[mysqld] max_connections=1000
6. MySQL 内存不足
如果您使用MySQL客户端程序运行查询并遇到相关错误,则意味着 MySQL 没有足够的内存来存储整个查询结果。
第一步是确保查询正确,如果正确,则执行以下操作:
- 如果你直接使用 MySQL 客户端,请使用 来启动它
--quick switch
,以禁用缓存结果或 - 如果您使用的是MyODBC驱动程序,则配置用户界面 (UI) 有一个用于标记的高级选项卡。选中“不缓存结果”。
另一个很好的工具是MySQL Tuner – 一个有用的脚本,它将连接到正在运行的 MySQL 服务器并提供如何配置以获得更高性能的建议。
$ sudo apt-get install mysqltuner #Debian/Ubuntu $ sudo yum install mysqltuner #RHEL/CentOS/Fedora $ mysqltuner
有关 MySQL 优化和性能调优技巧,请阅读我们的文章:15 个有用的 MySQL/MariaDB 性能调优和优化技巧。
7. MySQL 持续崩溃
如果遇到此问题,您应该尝试找出问题是否是MySQL服务器死机,还是客户端出现问题。请注意,许多服务器崩溃都是由损坏的数据文件或索引文件引起的。
您可以检查服务器状态来确定它已启动并运行了多长时间。
$ sudo systemctl status mysql #Debian/Ubuntu $ sudo systemctl status mysqld #RHEL/CentOS/Fedora
或者,运行以下mysqladmin 命令来查找 MySQL 服务器的正常运行时间。
$ sudo mysqladmin version -p
其他解决方案包括但不限于停止MySQL服务器并启用调试,然后重新启动服务。您可以尝试制作一个可用于重复该问题的测试用例。此外,打开另一个终端窗口并运行以下命令以在运行其他查询时显示 MySQL 进程统计信息:
$ sudo mysqladmin -i 5 status OR $ sudo mysqladmin -i 5 -r status
底线:确定导致问题或错误的原因
虽然我们已经研究了一些常见的MySQL问题和错误,并提供了一些排除故障和解决它们的方法,但诊断错误最重要的是了解它的含义(就导致错误的原因而言)。
那么你如何确定这一点呢?以下几点将指导你如何确定问题的确切原因:
- 第一个也是最重要的一步是查看目录中存储的 MySQL 日志
/var/log/mysql/
。您可以使用 tail 等命令行实用程序来读取日志文件。 - 如果 MySQL 服务无法启动,请使用systemctl检查其状态,或者使用systemd 下的journetctl(带有
-xe
标志)命令检查问题。 - 您还可以检查系统日志文件(例如
/var/log/messages
或类似文件)以查找问题的原因。 - 尝试使用Mytop、glances、top、ps或htop等工具来检查哪个程序占用了所有 CPU 或锁定了机器,或者检查是否耗尽了内存、磁盘空间、文件描述符或其他一些重要资源。
- 假设问题在于某些失控的进程,您可以随时尝试终止它(使用pkill 或 kill 实用程序),以便 MySQL 正常工作。
- 假设mysqld服务器出现了问题,您可以运行该命令:
mysqladmin -u root ping
或者mysqladmin -u root processlist
从中获取任何响应。 - 如果在尝试连接到 MySQL 服务器时问题出在您的客户端程序上,请检查它无法正常工作的原因,并尝试从中获取任何输出以进行故障排除。
您可能还想阅读以下与 MySQL 相关的文章:
- 初学者学习 MySQL/MariaDB – 第 1 部分
- 如何在 CentOS 7 上使用 Netdata 监控 MySQL/MariaDB 数据库
- 如何将所有 MySQL 数据库从旧服务器转移到新服务器
- Mytop - 一款用于监控 Linux 中 MySQL/MariaDB 性能的有用工具
- 12 个适用于 Linux 的 MySQL/MariaDB 安全最佳实践
有关更多信息,请查阅有关问题和常见错误的MySQL 参考手册,它全面列出了您在使用 MySQL 时可能遇到的常见问题和错误消息,包括我们上面讨论过的问题等等。