网站搜索

解决 MySQL 中常见错误的实用技巧


MySQLOracle旗下广泛使用的开源关系数据库管理系统(RDMS)。多年来,它一直是基于 Web 的应用程序的默认选择,并且与其他数据库引擎相比仍然很受欢迎。

另请阅读:如何在 RHEL/CentOS 和 Fedora 上安装最新的 MySQL

MySQL 是针对 Web 应用程序设计和优化的 - 它构成了主要基于 Web 的应用程序的一个组成部分,例如 FacebookTwitter维基百科YouTube 等等。

您的网站或 Web 应用程序是否由 MySQL 提供支持?在这篇详细的文章中,我们将解释如何解决 MySQL 数据库服务器中的问题和常见错误。我们将描述如何确定问题的原因以及如何解决问题。

1. 无法连接本地MySQL服务器

MySQL 中常见的客户端到服务器连接错误之一是“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) ” ”。

此错误表明主机系统上没有运行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) Can't connect to MySQL server on ‘server’ (10061)”,这意味着网络连接被拒绝。

在这里,首先检查系统上是否有 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)

这些错误表明服务器可能正在运行,但是您正在尝试使用与服务器正在侦听的端口、命名管道或 Unix 套接字文件不同的 TCP/IP 端口、命名管道或 Unix 套接字文件进行连接。

3. MySQL 中的访问被拒绝错误

MySQL中,用户帐户是根据用户名以及用户可以连接到服务器的客户端主机来定义的。此外,帐户还可能具有身份验证凭据,例如密码。

尽管导致“拒绝访问”错误的原因有很多,但常见原因之一与服务器允许客户端程序在连接时使用的 MySQL 帐户有关。它表明连接中指定的用户名没有访问数据库的权限。

MySQL 允许创建帐户,使客户端用户能够连接到服务器并访问服务器管理的数据。在这方面,如果您遇到拒绝访问错误,请检查是否允许该用户帐户通过您正在使用的客户端程序连接到服务器,并可能检查连接来源的主机。

您可以通过运行 SHOW GRANTS 命令来查看给定帐户拥有哪些权限,如下所示。

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

您可以在 MySQL shell 中使用以下命令向远程 IP 地址的特定数据库上的特定用户授予权限。

> grant all privileges on *.test_db to 'tecmint'@'192.168.0.100';
> flush privileges;

此外,拒绝访问错误也可能是由于连接 MySQL 的问题导致的,请参阅前面解释的错误。

4. 失去与 MySQL 服务器的连接

由于以下原因之一,您可能会遇到此错误:网络连接不良连接超时BLOB 值存在问题大于最大允许数据包。如果出现网络连接问题,请确保网络连接良好,尤其是在访问远程数据库服务器时。

如果是连接超时问题,特别是当MySQL尝试使用与服务器的初始连接时,请增加connect_timeout参数的值。但如果 BLOB 值大于 max_allowed_packet,则需要在 /etc 中为 max_allowed_packet 设置更高的值[mysqld][client] 部分下的 /my.cnf 配置文件,如图所示。

[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)由max_connections系统变量控制;您可以通过增加其值以允许 /etc/my.cnf 配置文件中的更多连接来解决该问题。

[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问题和错误,并提供了排查和解决它们的方法,但诊断错误最重要的是理解它的含义(就导致错误的原因而言) 。

那么如何确定这一点呢?以下几点将指导您如何确定到底是什么导致了问题:

  1. 第一步也是最重要的一步是查看存储在目录 /var/log/mysql/ 中的 MySQL 日志。您可以使用命令行实用程序(例如 tail)来读取日志文件。
  2. 如果MySQL服务无法启动,请使用systemctl检查其状态或使用systemd下的journetctl(带有-xe标志)命令来检查问题。
  3. 您还可以检查系统日志文件,例如 /var/log/messages 或类似文件,以了解问题的原因。
  4. 尝试使用 Mytop、glances、top、ps 或 htop 等工具来检查哪个程序正在占用所有 CPU 或正在锁定计算机,或者检查是否耗尽内存、磁盘空间、文件描述符或其他一些重要资源。
  5. 假设问题是某个失控的进程,您始终可以尝试杀死它(使用 pkill 或 Kill 实用程序),以便 MySQL 正常工作。
  6. 假设mysqld服务器引起问题,您可以运行命令:mysqladmin -u root pingmysqladmin -u root processlist来获取任何从中得到回应。
  7. 如果问题出在您的客户端程序在尝试连接到 MySQL 服务器时,请检查其无法正常工作的原因,并尝试从中获取任何输出以进行故障排除。

您可能还想阅读以下 MySQL 相关文章:

  1. 初学者学习 MySQL/MariaDB – 第 1 部分
  2. 如何在 CentOS 7 上使用 Netdata 监控 MySQL/MariaDB 数据库
  3. 如何将所有 MySQL 数据库从旧服务器转移到新服务器
  4. Mytop – 在 Linux 中监控 MySQL/MariaDB 性能的有用工具
  5. Linux 的 12 个 MySQL/MariaDB 安全最佳实践

有关更多信息,请参阅 MySQL 参考手册中有关问题和常见错误的内容,它全面列出了您在使用 MySQL 时可能遇到的常见问题和错误消息,包括我们上面讨论过的问题和更多信息。