MySQL Too Many Connections

2024 年 8 月 29 日 | 5 分钟阅读

什么是 MySQL?

MySQL 是一款开源的关系型数据库管理系统(RDBMS),它使用结构化查询语言(SQL)来管理关系型数据库。最初由 MySQL AB 于 1994 年开发,已被 Uber、Netflix、Pinterest、Amazon、Airbnb 和 Twitter 等 5,000 多家公司采用。

特点包括

  • 易于访问
    由于 MySQL 是开源的,任何人都可以下载、使用和修改该软件。它易于使用且免费。MySQL 的源代码可供学习和根据需要进行定制。它使用了 GPL(GNU 通用公共许可证),该许可证规定了对程序允许和不允许的行为的限制。
  • 快速且可靠
    MySQL 有效地将信息保存在内存中,以确保一致性并防止重复。MySQL 能够快速访问和操作数据。
  • 适应性强
    系统能够与大大小小的机器群以及其他类型的数据协同工作的能力称为可伸缩性。MySQL 服务器是为了处理大型数据库而设计的。
  • 数据格式
    支持多种数据类型,包括浮点数(FLOAT)、双精度数(DOUBLE)、字符(CHAR)、可变字符(VARCHAR)、文本、日期、时间、日期时间、时间戳、年份,有符号和无符号整数,以及更多。
  • 字符组
    它与其他字符集兼容,例如德语、Ujis、Latin 1(cp1252 字符编码)、其他 Unicode 字符集等。
  • 成为保护
    由于其可自定义的密码系统,该系统根据主机验证密码,然后才允许访问数据库,因此它提供了一个安全的接口。连接服务器时,密码会进行加密。
  • 支持大型数据库
    该软件支持大型数据库,最多可达 5,000,000,000 行、150,000-200,000 张表以及 4000-5000 万条记录。

什么是“MySQL 连接数过多”错误?

当登录 MySQL 时,有时会拒绝连接并收到“MySQL 连接数过多”的错误消息。当服务器达到配置的最大并发连接数时,会显示此类错误消息。例如,客户端应用程序(如 Web 服务器)连接到服务器并建立连接。因此,并发连接达到了最大限制,并发生了错误。

可以使用 SHOW VARIABLE 语句查找有关服务器允许的最大连接数的信息

可能的输出

变量名
最大连接数50

当前占用的连接数可以通过以下语句找到

可能的输出

变量名
已连接线程数50

如果 MySQL 服务器的 threads_connected(已连接线程数)等于其最大连接数,客户端将收到“连接数过多”的错误消息。

允许的新连接数 = 最大连接数 - 已连接线程数 = 50 - 50 = 0

我们还可以通过执行以下语句查看当前有多少活动连接

可能的输出

变量名
正在运行线程数10

这意味着数据库中有 40 个连接 (50-10=40) 处于空闲状态。

为什么会导致此错误?

“MySQL 连接数过多”错误可能由多种不同原因引起,例如

  • 大量流量
  • 连接中断
  • 应用程序代码效率低下
  • 服务器限制
  • 容量耗尽

让我们逐一讨论。

  • 大量流量:有时 MySQL 服务器会处理大量传入连接请求,这可能会达到最大连接数限制,从而导致此错误。当数据库服务器处理更多客户端时,就会发生这种情况。
  • 连接中断:使用服务器时,客户端应用程序未能正确关闭其数据库连接。一段时间后,这些未关闭的连接很容易导致此类错误。
  • 应用程序代码效率低下:效率低下的应用程序代码有时由于连接管理效率低下而创建大量数据库连接。
  • 服务器限制:max_connections 系统变量包含最大允许连接数的值。如果达到此限制,则会遇到“连接数过多”错误。
  • 容量耗尽:由于硬件能力不足,MySQL 服务器可能无法管理大量连接;因此,必须立即解决资源限制问题。

如何防止“连接数过多”错误?

当遇到此类错误时,采取必要的行动并找出根本原因非常重要,这样我们才能防止该错误。

  • 修改 MySQL 配置:这是一种短期或临时解决方案,通过增加 MySQL 服务器中的 max_connections 配置来实现。
  • 消除不必要的连接:使用 MySQL 命令行工具,从数据库中杀死或消除空闲连接。
  • 改进客户端应用程序中效率低下的代码:连接中断会导致此错误。确保在使用服务器后正确关闭连接。
  • 应用连接池:连接池有助于服务器管理和重用数据库连接,从而减少并发连接。在您的应用程序中实现连接池。
  • 扫描副本和资源平衡:扫描副本以管理读密集型工作负载,资源平衡有助于在服务器中分配负载。
  • 修改服务器能力:如果此错误经常发生,请尝试评估服务器的硬件资源并对其进行优化,以更好地管理连接负载。
  • 设置连接超时:这是最好的预防措施之一。如果您忘记关闭连接,则为空闲连接使用超时时间。
  • 分析用户效益:应调整 max_user_connection 变量。
  • 横向扩展:分片和横向扩展等策略被视为横向扩展,它可以在应用程序增长时更好地管理连接。
  • 频繁检查和维护:建立例行维护和监控程序,以便及早发现问题并在它们导致“连接数过多”错误之前修复它们。

“连接数过多”错误的解决方案是什么?

此错误可以通过在运行时增加 max_connections 参数的值来解决;这是一个临时过程。

更改 max_connections 参数(临时)

当服务器运行时,输入以下 SQL 语句以临时更改此变量

注意:要以 root 身份执行此 SQL 语句,不需要断开当前连接的客户端。服务器允许一个额外连接,超过 max_connections 的值。为 root 用户和任何其他具有 SUPER 权限的用户预留一个连接。

重新启动 MySQL 服务器守护进程 (mysqld) 后,上述值将恢复到 my.cnf 或 my.ini 文件中看到的先前值。使用以下过程创建永久更改

更改 max_connections 参数(永久)

将此选项添加到选项文件(my.cnf 或 my.ini,取决于您的系统)可能是修改 max_connections 值并使其在下次服务器运行时生效的更好方法。将以下行放入您的 /etc/my.conf 文件中,假设您正在使用该文件。

为了使修改生效,请重新启动 mysqld 守护进程。

适用于 RHEL 6/CentOS

适用于 RHEL 7/CentOS


下一主题MySQL Split