【问题标题】:How to solve MySQL max_user_connections error如何解决 MySQL max_user_connections 错误
【发布时间】:2012-06-26 09:03:36
【问题描述】:

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

用户 ** 已经有超过 'max_user_connections' 个活动连接

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

感谢您的宝贵时间!

【问题讨论】:

  • 请尝试提供更多背景信息,您甚至没有告诉我们您使用的是什么语言...
  • 嗨,Trufa,感谢您的检查,已更新:)
  • 我仍然认为这个问题可以有更多细节,无论如何,你有没有试过用谷歌搜索你的问题? goo.gl/xW9Oe 好像有很多有趣的答案,也许能帮上忙。

标签: mysql


【解决方案1】:

阅读max_connections文档解决您的问题

如果客户端在尝试连接时遇到太多连接错误 连接到 mysqld 服务器,所有可用的连接都在使用 其他客户。

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

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

SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+

然后尝试使用以下运行命令增加 max_connection 参数:

 SET GLOBAL max_connections = 300;

或者在位于/etc/my.cnf的my.cnf中设置这个参数

vi /etc/my.cnf
max_connections = 300

最后:重启mysql服务

【讨论】:

  • 请提供的不仅仅是文档链接以获得答案。
【解决方案2】:

最好的办法是增加max_connections。对于服务于多个不同 Web 应用程序(原始 php、WordPress、phpBB)的 MySQL 实例,您可能希望此值至少为 60。

发出这个命令,你会发现你有多少全局连接可用:

show global variables like '%connections%'

您可以像这样找出在任何给定时刻正在使用的连接数:

show status like '%connected%'

你可以像这样找出每个连接在做什么:

show full processlist

如果我是你,我会尝试至少 100 个连接的全局值。如果您无权执行此操作,您的服务提供商应该能够帮助您。它需要在 MySQL 的 my.cnf 文件配置中完成。不要将其设置得太高,否则您的 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 Mysql automatically when ubuntu on EC2 micro instance kills it when running out of memory

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

【讨论】:

    【解决方案3】:

    这是由于mysql配置中指定的限制,系统变量max_user_connections

    解决方案

    如果是 SELECT 查询,我会建议终止卡在后端的查询。不会终止更改数据的查询,例如 UPDATE/DELETE/INSERT。

    其次,您可以使用命令mysqladmin processlist 来检查mysql内部发生了什么。

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

    【讨论】:

    • 感谢您的回答!这是一个老问题(超过 5 年),并且投票率不高,因此不会引起太多关注,但是您提到了一些其他答案(锁)中没有的东西,这很好。不过,在一个 mySQL 问题上链接到solidDB 的文档有点令人惊讶——这是故意的吗?
    • 哦,谢谢@RJHunter。我的坏处只是了解什么是表级锁和行级锁,而不是与solidDB相关。
    【解决方案4】:

    首先,这是一个 hack,但可以工作,尤其是在共享主机上。
    有时我们都有不好的“邻居”,对吧?

    如果您有权访问您的 /etc/,请在您的 my.cnf 中或通过信息架构将限制从 30 增加到 50。

    1. 要忽略访问者可能看到的错误消息,请使用@mysql_connect()
    2. 如果MUC超过30个,使用“or die()”语句停止查询。
    3. die(header(location: THIS PAGE))替换“or die”消息,并确保mysql_close();

    是的,它会导致页面加载延迟。但最好加载而不是白屏死机 - 或更糟糕的访问者不了解的错误消息。

    【讨论】:

    • OP 不要求 PHP 解决方案,我在 C# 上下文中遇到了同样的问题。
    【解决方案5】:

    看起来查询卡在服务器上。重新启动,一切都会好起来的。 如果您使用的是共享主机,请联系您的主机提供商,他们会修复它。 我是 namecheap 用户,他们解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多