【问题标题】:mySQL Error 1040: Too Many ConnectionmySQL 错误 1040:连接过多
【发布时间】:2012-12-29 03:44:31
【问题描述】:

如何解决这些问题,“SQL 错误 1040:连接过多” 即使我尝试放

max_user_connection=500

还是“连接太多”

【问题讨论】:

标签: mysql connection


【解决方案1】:

如果您这样的连接用完了,很有可能您没有关闭已打开的连接。

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

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

show processlist

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

【讨论】:

  • 在查询结束时我的所有代码之后我总是关闭连接...此错误仅在我打开另一台计算机或我的程序时出现
  • 但它真的被关闭了吗?异常可能导致关闭被跳过
  • 是的。当我们使用 2-20 台计算机时,它可以正常工作,但是当我们添加 30 台以上时,会出现错误 1040
  • 在这种情况下,我同意@SirRufo 的服务器端连接限制太低。尝试在 my.ini/my.cnf 中将 max_connections 设置得更高。
  • 如果有人要在将近两年后对某个答案投反对票,那么为我和整个社区留下投反对票的理由会对我和整个社区有所帮助。
【解决方案2】:

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

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

MySQL Too many connections

【讨论】:

  • 没有限制应该是最好的选择吗?
  • 这是最好的选择“除非您需要限制每个用户连接”;o)
【解决方案3】:

试试这个:

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

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

【讨论】:

  • 粘贴该行导致此错误:“mysql: [ERROR] Found option without prior group in config file /etc/mysql/my.cnf at line 22!mysql: [ERROR] Fatal error in默认处理。程序中止!"
【解决方案4】:

在您的程序中,您会打开连接并保持打开状态而不关闭它。

我遇到了同样的问题,终于确定了。

我在 try catch 之后添加了这段代码。

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

【讨论】:

  • 您可以使用using 关键字以更简洁的方式执行此操作。
  • @EricJ。仅供参考,上面的代码 sn-p 位于 java 而不是 C#。
  • 每个 close 语句都应该有它自己的 try-catch 块吗?仅记录也是不好的做法,最好重新抛出。
【解决方案5】:

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

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

【讨论】:

  • 可用磁盘空间不足导致 MySQL 在 INSERT 或 UPDATE 完成之前等待,这反过来又导致挂起的用户连接数增加,直到达到限制。跨度>
【解决方案6】:

MySQL:错误 1040:连接过多

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

以下这些原因导致 MySQL 连接不足。

  1. 慢查询

  2. 数据存储技术

  3. MySQL 配置错误

通过执行以下操作,我能够克服这个问题。

打开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 量。

【讨论】:

  • 请注意:新的默认 max_connections 为 151。请参阅 dev.mysql.com/doc/refman/5.5/en/too-many-connections.html
  • 嗨,如果您在文件系统的某些配置中设置了 max_connections 怎么办?这个全局集合还会占据主导地位吗?
  • "现在当你下次重启 MySQL 时它会使用这个设置而不是默认设置。"--真的是这样吗?
  • @DingxinXu 这个修复在我的 RHEL7 机器上只是临时的。我必须修改 /etc/my.cnf 以拥有 max_connections = 200 以使更改在 MySQL 重新启动时持续存在。
【解决方案7】:

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

所以如果你尝试从workbench访问mysql,你会得到“too many connections”的错误。

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

【讨论】:

    【解决方案8】:

    出现此错误,是由于连接限制达到了配置文件my.cnf中定义的最大限制。

    为了修复这个错误,以root用户登录MySQL(注意:你可以以root用户登录,因为mysql会为root user预先分配一个额外的连接)并增加ma​​x_connections 变量,使用以下命令:

    SET GLOBAL max_connections = 500;
    

    此更改将一直存在,直到下一次服务器重新启动。为了使此更改永久生效,您必须在配置文件中进行修改。你可以这样做,

    vi /etc/my.cnf
    
    [mysqld]
    max_connections = 500
    

    This article有详细的步骤workaround to fix this error。看看它,我希望它可以帮助你。谢谢。

    【讨论】:

    【解决方案9】:

    查看配置了多少个连接供您的数据库使用:

    select @@max_connections;
    

    改变它:

    set global max_connections = 200;
    

    查看当前有多少连接:

    show processlist;
    

    我还写了this piece of software 来帮助我创建一个很好的交易电子表格,以便我可以追踪哪些查询是问题所在:

    【讨论】:

      【解决方案10】:

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

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

      几分钟后我解决了这个问题,似乎其他客户端释放了连接,我也尝试同时重启vs和workbench。

      【讨论】:

        【解决方案11】:

        即使我的所有连接都包含在 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
        }
        

        这样你的连接被允许关闭并在你去做其他事情之前释放回线程池

        【讨论】:

          【解决方案12】:

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

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

          第一步:

          登录 MySQL 并运行以下命令:SET GLOBAL max_connections = 100;

          现在登录 MySQL,连接太多错误已修复。此方法不需要重启服务器。

          第二步:

          使用上面的 step1 可以解决这个问题,但是当 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 服务器中的打开表限制以适应额外的请求。最后。关闭服务器上已完成事务的连接非常重要。

          【讨论】:

            【解决方案13】:

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

            【讨论】:

              猜你喜欢
              • 2015-03-24
              • 2017-10-30
              • 1970-01-01
              • 1970-01-01
              • 2020-04-27
              • 2015-08-06
              • 2014-06-27
              • 2019-07-15
              • 1970-01-01
              相关资源
              最近更新 更多