【问题标题】:php, mysql - Too many connections to database errorphp, mysql - 与数据库的连接过多错误
【发布时间】:2011-06-29 17:30:53
【问题描述】:

大家好。我有一个奇怪的错误。我创建了一个像这样工作的聊天:

  • 问题/答案被插入到数据库中
  • 每 2 秒,一个 ajax 请求被发送到获取新问题/答案的 php 脚本

直到今天我收到此错误时,它都可以正常工作:

Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1040] Too many connections' in /var/www/html/dbdev/include/Zend/Db/Adapter/Pdo/Abstract.php:129 
Stack trace: #0 /var/www/html/dbdev/include/Zend/Db/Adapter/Pdo/Abstract.php(129): PDO->__construct('mysql:host=loca...', '', '', Array) 
s#1 /var/www/html/dbdev/include/Zend/Db/Adapter/Pdo/Mysql.php(96): Zend_Db_Adapter_Pdo_Abstract->_connect() 
s#2 /var/www/html/dbdev/include/Zend/Db/Adapter/Abstract.php(448): Zend_Db_Adapter_Pdo_Mysql->_connect() 
s#3 /var/www/html/dbdev/include/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('select profile_...', Array) 
s#4 /var/www/html/dbdev/include/Zend/Db/Adapter/Abstract.php(782): Zend_Db_Adapter_Pdo_Abstract->query('select profile_...', Array) 
s#5 /var/www/html/dbdev/include/Profile.php(43): Zend_Db_Adapter_Abstract->fetchPairs('select profile_...') 
s#6 /var/www/html/dbdev/public_html/index.php(29): Profile->load() 
s#7 {main} Next exception 'Zend_Db_Adapter_Exception' with in /var/www/html/dbdev/include/Zend/Db/Adapter/Pdo/Abstract.php on line 144

问题是我们没有那么多......(8)而且我认为数据库不能同时支持超过 8 到 16 个连接(规范上写着聊天必须支持 50-100 个用户所以 8 是……小)。

所以...谁能告诉我为什么会发生这种情况(昨天我们 15 岁并且工作正常)以及如何解决它?谢谢您的帮助。如果您需要任何代码示例,请询问。

【问题讨论】:

  • “显示变量如 'max_connections';”的结果在 mysql 客户端上
  • 当mysql因为包含data-dir的磁盘已满而无法打开连接时也会出现此错误消息。

标签: php mysql zend-framework pdo database-connection


【解决方案1】:

“Too Many Connections”错误有很多不同的原因。

在 MySQL.com 上查看此常见问题解答页面:http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html

检查您的 my.cnf 文件中的“max_connections”。如果不存在,请尝试:

[mysqld]
set-variable=max_connections=250

不过默认是 151,所以应该没问题。

如果您在共享主机上,可能是其他用户占用了太多连接。

需要注意的其他问题是持久连接的使用和磁盘空间不足。

【讨论】:

    【解决方案2】:

    错误SQLSTATE[HY000] [1040] Too many connections是SQL错误,与sql server有关。可能有其他应用程序连接到服务器。服务器具有最大可用连接数。

    如果你有 phpmyadmin,你可以使用“变量”选项卡来检查设置是什么。

    您也可以像这样查询 status 表:

    show status like '%onn%';
    

    或对此有所不同。检查the manual 有哪些变量

    (请注意,“连接”不是当前连接,请检查该链接:))

    【讨论】:

    • (添加了另一种查看这些变量的方式)
    【解决方案3】:

    如果您已达到 mac 连接限制 转到/etc/my.cnf 并在[mysqld] 部分下添加 max_connections = 500

    然后重启 MySQL。

    【讨论】:

      【解决方案4】:

      如果您需要在不重启 MySQL 的情况下增加 MySQL 连接数,请执行以下操作,如果您不知道配置文件,请在下面使用 mysqlworkbench 或 phpmyadmin 或命令提示符运行以下查询。

      mysql> show variables like 'max_connections';
      +-----------------+-------+
      | Variable_name   | Value |
      +-----------------+-------+
      | max_connections | 151   |
      +-----------------+-------+
      1 row in set (0.00 sec)
      
      mysql> SET GLOBAL max_connections = 250;
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> show variables like 'max_connections';
      +-----------------+-------+
      | Variable_name   | Value |
      +-----------------+-------+
      | max_connections | 250   |
      +-----------------+-------+
      1 row in set (0.00 sec)
      

      这些设置将在 MySQL 重新启动时更改。


      对于永久更改,在 my.cnf 中添加以下行并重新启动 MySQL。

      max_connections = 151
      

      【讨论】:

        【解决方案5】:

        请检查您是否为每个请求打开了新连接 (mysql_connect(...))。如果这样做,请确保在之后关闭连接(使用 mysql_close($link))。

        此外,您应该考虑更改此行为,因为为每个用户保持一个稳定的连接可能是完成任务的更好方法。

        如果您还没有,请查看这个明显但仍然有用的信息资源:http://php.net/manual/function.mysql-connect.php

        【讨论】:

          【解决方案6】:

          这可能是由于同时连接过多或同时聊天过多。它也可能由于会话过多而发生。

          解决此问题的最佳方法是重新启动 MySQL。

          service mysqld restart
          

          service mysql restart
          

           /etc/init.d/mysqld restart
          

          【讨论】:

            猜你喜欢
            • 2015-04-23
            • 2020-12-12
            • 2014-03-07
            • 1970-01-01
            • 2011-11-24
            • 1970-01-01
            • 2016-12-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多