PHP、MySQL - 数据库连接过多错误

21

大家好。我遇到一个奇怪的错误。我创建了一个聊天室,其工作方式如下:

  • 问题/答案被插入到数据库中
  • 每隔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个人,工作正常),怎么解决呢?感谢您的帮助。如果需要代码示例,请随时提出。


在 MySQL 客户端中执行 "show variables like 'max_connections';" 的输出是什么? - Zimbabao
当mysql无法打开连接,因为包含“data-dir”的磁盘已满时,也会出现此错误消息。 - Will B.
6个回答

40

"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,所以你应该没问题。

如果你使用的是共享主机,可能会有其他用户占用了过多的连接。

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


17

错误 SQLSTATE[HY000] [1040] Too many connections 是一个与 SQL 服务器有关的错误。可能是因为其他应用程序连接到了该服务器,而该服务器具有最大可用连接数。

如果您拥有 phpmyadmin,则可以使用“变量”选项卡来检查设置。

您也可以像这样查询状态表:

show status like '%onn%';

或者采用类似的变体,检查手册以获取可用的变量。

请注意,“connections”不是当前的连接,请查看链接 :)


(顺便提一下,还有另一种查看这些变量的方法) - Nanne

8

如果您达到了Mac连接限制,请前往/etc/my.cnf,在[mysqld]部分下添加max_connections = 500,然后重新启动MySQL。


6

如果您需要在不重启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

2
请检查您是否在每个请求中打开了一个新的连接(mysql_connect(...))。如果是这样,请确保在使用完后关闭连接(mysql_close($link))。
另外,您应该考虑改变这种行为,因为为每个用户保持一个稳定的连接可能是实现任务的更好方式。
如果您还没有这样做,请查看这个明显但仍然有用的信息资源:http://php.net/manual/function.mysql-connect.php

1
由于同时连接过多或同时进行太多聊天,可能会出现这种情况。此外,也可能由于会话过多而发生这种情况。
解决这个问题的最好方法是重新启动MySQL。
service mysqld restart

或者

service mysql restart

或者

 /etc/init.d/mysqld restart

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