MySQL错误1040:连接过多

81

如何修复这个"SQL Error 1040: Too Many Connection"的问题,即使我尝试执行以下操作:

max_user_connection=500

仍然是 "Too many connection"


以下是我们案例中唯一有效的解决方法:https://stackoverflow.com/questions/53226015/error-too-many-connections-on-codeigniter-website - Pedro Araujo Jorge
15个回答

85

MySQL:错误1040:连接过多

这基本上意味着MySQL同时处理最大数量的连接,并且默认情况下它可以同时处理100个连接。

以下原因会导致MySQL用尽连接:

  1. 慢查询

  2. 数据存储技术

  3. 不良的MySQL配置

我通过以下方法克服了这些问题。

打开MySQL命令行工具并键入:

show variables like "max_connections";

这将会返回类似于这样的结果。

+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 100   |
+-----------------+-------+
您可以通过下面的命令更改设置,例如将其更改为200,而无需重新启动MySQL服务器。
set global max_connections = 200;

现在,当您下次重新启动MySQL时,它将使用此设置而不是默认设置。

请记住,增加连接数会增加MySQL运行所需的RAM数量。


5
注意:新的默认最大连接数是151。请参见https://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html。 - jing
你好,如果你在文件系统的某些配置文件中设置了max_connections,那么这个全局设置是否仍将占主导地位? - dingx
1
现在,下次你重新启动MySQL时,它将使用这个设置而不是默认值。这真的是这样吗? - dingx
@DingxinXu 这个修复只在我的RHEL7机器上是临时的。我不得不修改/etc/my.cnf,将max_connections = 200添加进去,以便于在MySQL重新启动后更改可以保留。 - Kevin

42
值得注意的是,如果您的服务器分区或驱动器上可用的磁盘空间不足,这也会导致MySQL返回此错误。如果您确定问题不是实际number of users connected,则下一步是检查您的MySQL服务器驱动器/分区是否有可用空间。 2019年1月编辑:
这适用于MySQL 5.7和5.8。我不知道更高版本是否适用。

2
磁盘空间不足会导致MySQL在INSERTUPDATE完成之前等待,从而导致挂起的用户连接数量增加,直到达到限制。 - jimp

34

如果您的连接不足,很有可能是因为您没有关闭已经打开的连接。

请检查打开连接的代码,并确保尽早关闭这些连接。通常情况下,您要使用using关键字来包装实现了IDisposable接口的任何对象(包括数据库连接),以确保这些对象在离开需要它们的作用域时立即被处理。

您可以使用以下查询来检查当前活动连接数:

show processlist

参考:MySQL显示状态 - 活动连接还是总连接数?


在查询的末尾,我总是关闭连接,但当我在另一台计算机上打开程序时,就会出现这个错误。 - kelvzy
1
在这种情况下,我同意@SirRufo的观点,即服务器端连接限制太低。尝试在my.ini/my.cnf中将max_connections设置得更高。 - Eric J.
2
如果有人在近两年后要对一个答案进行踩票,为了我和整个社区的利益,请留下一个踩票原因。 - Eric J.
此答案不适用于MySQL。 - baldrs
@baldrs:在我回答问题后,问题被重新标记为MySQL。我更新了我的答案,展示了适用于MySQL的适当查询语句。 - Eric J.
显示剩余5条评论

27

这个错误是由于连接数量达到了在配置文件my.cnf中定义的最大限制而导致的。

为了解决这个错误,以root用户身份登录MySQL(注意:你可以以root身份登录,因为mysql会预分配额外的一个连接给root用户),并使用以下命令增加max_connections变量:

SET GLOBAL max_connections = 500;

这个更改会一直存在,直到下一次服务器重启。如果要使这个更改永久生效,您需要在配置文件中进行修改。您可以通过以下方式完成此操作:

vi /etc/my.cnf

[mysqld]
max_connections = 500

这篇文章详细介绍了一步一步的解决这个错误的方法。请查看,希望对你有所帮助。谢谢。


增加连接数并不总是一个好主意,因为这会增加内存占用。请参阅顶级投票答案,其中指出了这一点:https://dev59.com/2mYq5IYBdhLWcg3woB-7#42196994 - Sybille Peters

9

您需要更改 max_connections 以增加允许的总连接数。

并将 max_user_connections 设置回默认值 0 => 没有限制,除非您需要按用户连接 限制

MySQL Too many connections


为什么不限制应该是最好的选择? - Sybille Peters
这是最好的选择,除非您需要限制每个用户的连接;o) - Sir Rufo

8

在您的程序中,您可能已经打开了连接并没有关闭它。

我遇到了同样的问题,并最终确定了原因。

在try catch之后,我添加了以下代码。

finally{
    try {
        rs.close();
        p.close();
        conn.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

你可以使用 using 关键字以更简洁的方式完成这个任务。 - Eric J.
1
@EricJ。FYI上面的代码片段是用java编写的,而不是C# - user2575725
每个 close 语句是否都应该有自己的 try-catch 块?仅仅记录日志是不好的做法,最好重新抛出异常。 - tkruse

7

查看您的数据库配置了多少连接:

select @@max_connections;

改变它的方法:
set global max_connections = 200;

查看当前连接数:

show processlist;

我还写了这个软件(MySQL Slow Log Analyzer),以帮助我创建一个漂亮的交易时间表格,这样我就可以追踪到哪些查询是问题所在:enter image description here

2
请尝试以下操作:
打开终端并输入此命令:sudo gedit /etc/mysql/my.cnf 在my.cnf文件中粘贴以下行:set-variable=max_connections=500

粘贴该行代码导致以下错误:"mysql: [ERROR] 在配置文件 /etc/mysql/my.cnf 的第22行找到无前置组的选项! mysql: [ERROR] 默认值处理中发生致命错误。程序已终止!" - Nav

1
这个问题通常发生在MySQL允许的最大并发连接数超过限制时。允许的最大连接数存储在全局变量max_connections中。您可以通过在MySQL中使用show global variables like max_connections;来检查它。
您可以按照以下步骤解决该问题: 步骤1: 登录到MySQL并运行此命令:SET GLOBAL max_connections = 100; 现在登录到MySQL,已修复连接过多的错误。此方法不需要服务器重启。 步骤2: 使用上述步骤1,您可以解决此问题,但是当mysql重新启动时,max_connections将回滚到其默认值。
为了使max_connection值永久生效,请更新my.cnf文件。
停止MySQL服务器:Service mysql stop 编辑配置文件my.cnf:vi /etc/mysql/my.cnf 在mysqld部分下找到max_connections变量。 [mysql] max_connections = 300 设置更高的值并保存文件。
启动服务器:Service mysql start 注意:在增加max_connections变量值之前,请确保服务器有足够的内存处理新的请求和连接。
MySQL为每个连接预分配内存,并仅在连接关闭时才进行释放。当新的连接正在查询时,系统应具备足够的资源,如内存、网络和计算能力,以满足用户的请求。
此外,您还应考虑增加MySQL服务器中的打开表限制,以容纳额外的请求。最后,非常重要的是关闭在服务器上完成事务的连接。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接