如何解决MySQL max_user_connections错误

Yas*_*u G 6 mysql

我尝试登录phpMyAdmin时出现以下错误.

User **已经超过'max_user_connections'活动连接

谁能让我知道如何从MySQL服务器端关闭这些数据库连接?

感谢您的时间!

osy*_*yan 10

阅读max_connections文档来解决您的问题

如果客户端在尝试连接到 mysqld 服务器时遇到“连接过多”错误,则所有可用连接都已被其他客户端使用。

允许的连接数由 max_connections 系统变量控制。默认值为 151,以提高 MySQL 与 Apache Web 服务器一起使用时的性能。要支持更多连接,请将 max_connections 设置为更大的值。

首先:检查当前数据库 max_connection 变量

SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
Run Code Online (Sandbox Code Playgroud)

然后尝试通过运行以下命令来增加 max_connection 参数:

 SET GLOBAL max_connections = 300;
Run Code Online (Sandbox Code Playgroud)

或者在 my.cnf 中设置此参数,主要位于 /etc/my.cnf

vi /etc/my.cnf
max_connections = 300
Run Code Online (Sandbox Code Playgroud)

最后:重启MySQL服务

仅供参考,
您还可以检查 max_user_connections。然而,它们是这样关联的:

max_connections 设置总连接限制
max_user_connections 设置每个用户的限制

====

正如 Sushilzzz 所问:这可能是 RAM 不足造成的吗?
简短回答:没有
长回答:是的,如果 RAM 大小较低并且 MySQL 无法根据需要快速响应,则会有许多打开的连接,您可以轻松达到最大连接。
每 1GB 内存的最大连接数估计为 100(如果您没有任何其他进程同时使用内存)。我通常对每 1GB RAM 的 max_connection 使用 ~75

RAM      max_connection
1GB      70      
2GB      150      
4GB      300      
8GB      500  
Run Code Online (Sandbox Code Playgroud)


O. *_*nes 5

你最好的选择是增加max_connections。对于服务多个不同 Web 应用程序(原始 php、WordPress、phpBB)的 MySQL 实例,您可能需要至少 60 的值。

发出此命令,您将了解有多少个可用的全局连接:

show global variables like '%connections%'
Run Code Online (Sandbox Code Playgroud)

您可以了解在任何给定时刻有多少个连接正在使用,如下所示:

show status like '%connected%'
Run Code Online (Sandbox Code Playgroud)

您可以这样了解每个连接正在做什么:

show full processlist
Run Code Online (Sandbox Code Playgroud)

如果我是你,我会尝试设置至少 100 个连接的全局值。如果您无权执行此操作,您的服务提供商应该能够帮助您。需要在my.cnfMySQL的文件配置中完成。不要将其设置得太高,否则您将面临 MySQL 服务器进程耗尽所有 RAM 的风险。

第二种方法允许您将这些总体连接分配给不同的 MySQL 用户。如果您的每个 Web 应用程序都有不同的 MySQL 用户名,那么此方法将适合您。这种方法写在这里。https://www.percona.com/blog/2014/07/29/prevent-mysql-downtime-set-max_user_connections/

控制这个问题的最终方法更加微妙。您可能正在使用 Apache Web 服务器作为底层技术。您可以减少同时运行的 Apache 任务的数量,但矛盾的是,却增加了吞吐量。这是因为 Apache 会对请求进行排队。如果有几个任务有效地处理队列,那么通常比许多任务要快,因为争用较少。它还需要更少的 MySQL 连接,这将解决您眼前的问题。这里的解释是:Restart Mysqlautomaticallywhenubuntu on EC2 microinstancekills it when running out of memory

顺便说一句,像 WordPress 这样的 Web 应用程序使用持久连接池。也就是说,它们建立与 MySQL 数据库的连接,保持它们打开,然后重用它们。如果您的应用程序很忙,则每个连接的生命周期应该是几分钟。


raw*_*989 5

发生这种情况是由于 mysql 配置系统变量 中指定的限制max_user_connections

解决方案

如果它是 SELECT 查询,那么终止卡在后端的查询只是我建议的一个解决方案。更改数据的查询(例如 UPDATE/DELETE/INSERT)不会被终止。

其次,可以使用命令mysqladmin processlist查看mysql内部发生了什么情况。

如果锁定导致您的问题,您可以检查您正在使用的引擎并将其更改为另一个引擎。IBM关于表锁的 SolidDB 文档可能会对您有所帮助。尽管这可能还有其他原因。(例如,也许您的查询由于未优化的查询而花费了太长的时间,或者表大小太大,或者您的数据库充满了垃圾邮件)。