mySQL错误1040:连接太多

时间:2013-01-15 04:08:55

标签: mysql connection

如何解决这些问题,“SQL错误1040:连接太多” 即使我试着把

max_user_connection=500

仍然“连接太多”

13 个答案:

答案 0 :(得分:27)

MySQL:ERROR 1040:连接太多

这基本上告诉MySQL同时处理最大连接数,默认情况下它同时处理 100 连接。

以下原因导致MySQL耗尽连接。

  1. 慢速查询

  2. 数据存储技术

  3. 错误的MySQL配置

  4. 我能够通过以下方式解决这个问题。

    打开MySQL command line tool并输入

    show variables like "max_connections";
    

    这将返回给你这样的东西。

    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | max_connections | 100   |
    +-----------------+-------+
    

    您可以将设置更改为例如通过发出以下命令200而不必重新启动MySQL服务器。

    set global max_connections = 200;
    

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

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

答案 1 :(得分:26)

值得一提的是,如果服务器分区或驱动器上的可用磁盘空间不足,这也会导致MySQL返回此错误。如果您确定实际number of users connected,那么下一步就是检查您的MySQL服务器驱动器/分区上是否有可用空间。

编辑2019年1月:
MySQL 5.7和5.8也是如此。我不知道上面的版本。

答案 2 :(得分:18)

如果您的连接不完整,那么您可能没有关闭已打开的连接。

查看打开连接的代码,并确保尽快关闭连接。通常,您希望在实现 IDisposable (包括数据库连接)的任何内容周围使用 using 关键字,以确保这些对象在它们离开作用域后立即处置需要。

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

show processlist

参考:MySQL show status - active or total connections?

答案 3 :(得分:9)

您必须更改max_connections以增加允许的总连接数。

并将max_user_connections设置回默认值0 => 无限制除非您需要限制此用户连接。

MySQL Too many connections

答案 4 :(得分:8)

在您的程序中,您可以打开连接并在不关闭的情况下保持打开状态。

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

我在尝试捕获后添加了此代码。

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

答案 5 :(得分:6)

由于连接限制达到配置文件my.cnf中定义的最大限制,会发生此错误。

为了解决此错误,请以root用户身份登录MySQL(注意:您可以以root用户身份登录,因为,mysql将为root user预先分配额外的一个连接)并增加< strong> max_connections 变量,使用以下命令:

SET GLOBAL max_connections = 500;

此更改将在那里,直到下次服务器重新启动。为了使此更改成为永久更改,您必须在配置文件中进行修改。你可以通过

来做到这一点
vi /etc/my.cnf

[mysqld]
max_connections = 500

This article已逐步详细workaround to fix this error。看看它,我希望它可以帮助你。感谢。

答案 6 :(得分:2)

要查看您的数据库使用了多少个连接,请执行以下操作:

select @@max_connections;

要更改它:

set global max_connections = 200;

要查看当前连接的数量:

show processlist;

我还写了this piece of software来帮助我创建一个不错的交易电子表格,这样我就可以找出问题所在: enter image description here

答案 7 :(得分:1)

试试这个:

打开终端并输入以下命令:sudo gedit /etc/mysql/my.cnf

将该行粘贴到my.cnf文件中:set-variable=max_connections=500

答案 8 :(得分:0)

检查当前正在运行的应用程序是否仍在访问您的mysql并消耗了所有数据库连接。

因此,如果您尝试从工作台访问mysql,您将得到太多的连接&#34;错误。

停止当前正在运行的Web应用程序,该应用程序将保留所有这些数据库连接,然后您的问题将得到解决。

答案 9 :(得分:0)

https://dev.mysql.com/doc/refman/8.0/en/too-many-connections.html中明确指出了该问题:

如果客户端在尝试进行以下操作时遇到太多连接错误 连接到MySQL服务器,所有可用连接正在被使用 其他客户。

几分钟后我解决了该问题,似乎其他客户端释放了连接,我也尝试同时重新启动vs和工作台。

答案 10 :(得分:0)

即使我的所有连接都包装在using语句中,我仍然遇到此错误。我忽略的是这些连接保持打开状态多久。

我正在做这样的事情:

using (MySqlConnection conn = new MySqlConnection(ConnectionString))
{
    conn.Open();
    foreach(var m in conn.Query<model>(sql))
    {
        // do something that takes a while, accesses disk or even open up other connections
    }
}

请记住,直到循环中的所有操作都完成,连接才会关闭;如果循环创建了更多的连接,则它们真的可以开始累加。

这更好:

List<model> models = null;
using (MySqlConnection conn = new MySqlConnection(ConnectionString))
{
    conn.Open();

    models = conn.Query<model>(sql).ToList(); // to list is needed here since once the connection is closed you can't step through an IEnumerable   
}

foreach(var m in models)
{
    // do something that takes a while, accesses disk or even open up other connections
}

这样一来,您就可以关闭连接并在执行其他操作之前释放回线程池

答案 11 :(得分:0)

此问题主要发生在已超过 MySQL 的最大允许并发连接数时。 允许的最大连接数存储在全局变量 max_connections 中。 你可以通过 MySQL 中的 show global variables like max_connections; 来查看

您可以通过以下步骤修复它:

第一步:

登录 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 服务器中的打开表限制以适应额外的请求。最后。关闭服务器上已完成事务的连接非常重要。

答案 12 :(得分:0)

问题通过重启数据库 windows 服务解决