MySQL错误“太多的连接”(MySQL Error “Too many connections”)

2019-06-17 18:47发布

我使用MySQL 5.0是由GoDaddy的(Linux版)托管的网站。

我在做我的web应用程序一些测试,突然我注意到页面被刷新真的慢。 最后,经过漫长的等待,我得到了一个页面,说一起“MySQL错误,连接太多......”东西线,并指出,其连接到数据库我的config.php文件。

它刚刚被我连接到数据库,没有其他用户。 在每一个我的网页,我包括在顶部的config.php文件,并关闭在页面末尾的MySQL连接。 有可能是之间的几个疑问。 我怕我不关闭MySQL连接不够(mysql_close())。

然而,当我尝试运行一个查询后关闭它们,我收到了网页上连接错误。 我的页面是PHP和HTML。 当我尝试关闭查询时,似乎下一个将无法连接。 我必须包括的config.php为了收盘后再次连接?

这个错误把我吓坏了,因为在2周,约84人开始使用该Web应用程序。

谢谢。

编辑:

这里是我的网页的一些伪代码:

 require_once('../scripts/config.php');

 <?php
    mysql_query..

    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
 ?>
 some html..
 ..
 ..
 ..
 ..
 <?php
   another mysql_query...
 ?>
 some more html..
 ..
 ..
 <?php mysql_close(); ?>

我计算过,这样,每个页面打开时间,打开连接,然后在页面加载完成连接关闭。 然后,连接再次打开时,有人点击页面上的按钮,等等...

编辑:

好了,所以我刚下车的电话与GoDaddy。 很显然,我的经济套餐,我仅限于一次50个连接。 虽然今天我的问题发生了,只有我访问该网站,他们说,他们有早期的一些服务器的问题。 不过,看到我如何将有84个用户对于我的web应用程序,我也许应该升级为“豪华”,它允许在同一时间100个连接。 在某一天,可能有大约30个用户同时访问我的网站,所以我觉得100是一个更安全的赌注。 难道你们同意吗?

Answer 1:

共享托管服务提供商通常允许同一用户同时连接的一个非常小的量。

你的代码的作用是:

  • 打开与MySQL服务器的连接
  • 做到这一点的东西(生成页面)
  • 收于页面端的连接。

最后一步,当在页面的最后做的是不是强制性的 :(报价mysql_close手册):

使用mysql_close()通常是不必要的,因为非持久打开链接在脚本执行结束时自动关闭。

但要注意,你可能不应该反正使用永久连接...

两个小技巧:

  • 使用mysql_connect的INSEAD mysql_pconnect (已经为您确认)
  • 的mysql_connect设置为false的第四个参数(你已经确定,因为它是默认值):(报价手册):

如果第二个电话是对mysql_connect()使用相同的参数,没有新的链接将被建立,而是已经打开的链接的链接标识将被退回。

参数new_link改变此行为并使mysql_connect()总是打开新的连接,甚至当mysql_connect()函数是与以前相同的参数调用。



什么会导致这个问题呢?

也许你正在试图访问并行多个页面(使用多标签浏览器,例如),这将使用本网站的同时模拟多个用户?

如果您在使用的同时该网站之间的代码,很多用户mysql_connect和关闭连接需要大量的时间,这将意味着在同一时间被打开很多连接......你会达到极限: - (

不过,因为你的应用程序的唯一用户,考虑到你有最多允许200个并发连接,有回事一些奇怪...



好了,想着“ 太多的连接 ”和“ max_connections ” ...

如果我没有记错, max_connections不限制可以打开与MySQL服务器的连接数,但可以开博到该服务器连接的总数由任何人连接到它

引用关于MySQL的文档的连接太多 :

如果您在尝试连接到mysqld服务器得到一个连接太多的错误,这意味着所有可用的连接都在被其他客户使用。

允许由MAX_CONNECTIONS系统变量控制连接的数量。 它的默认值是100。如果你需要支持更多的连接,你应该为这个变量设置一个较大的值。

所以,实际上,这个问题可能不是来自于你和你的代码(这看起来不错,实际上):它可能“仅仅”是,你是不是唯一一个试图连接到MySQL服务器(记住,“共同主办”) ,而且有太多的人在使用它的同时...

...... 如果我是对的,那就是 ,有什么可以做,来解决这个问题:只要有该服务器上有太多的数据库/用户和max_connection设置为200,你会继续痛苦.. 。


作为一个旁注:要回GoDaddy的前询问他们有关,这将是很好,如果有人可以验证我刚才说的^^



Answer 2:

我有大约18个月处理这个问题( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-error/ )

我的解决方案(将适用于你)到底依次为:

  1. 调根据数据库MySQLTuner 。
  2. 每周进行碎片整理在此基础上的表后

从后整理bash脚本:

#!/bin/bash

# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND
Data_free > 0` | grep -v '^+' | sed 's,t,.,' )"

for fragment in $FRAGMENTED_TABLES; do
  database="$( echo $fragment | cut -d. -f1 )"
  table="$( echo $fragment | cut -d. -f2 )"
  [ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database;
  OPTIMIZE TABLE $table;" > /dev/null 2>&1
done


Answer 3:

请确保您不使用持久连接。 这通常是一个坏主意..

如果你已经有了..充其量,你需要为你的Apache进程,以支持一样多的连接。 您是否能够改变max_connections的设置?



Answer 4:

你完全确保数据库服务器完全奉献给你?

登录到datbase为根,用“SHOW PROCESSLIST”,看看谁的连接。 理想的情况是这个勾到你的监控系统,查看有多少个连接有随着时间的推移和报警,如果有太多。

最大的数据库连接可以在my.cnf中进行配置,但要小心跑出来的内存或地址空间。



Answer 5:

如果你有shell访问,用netstat看看有多少插座打开你的数据库和他们来自哪里。

在Linux上,键入:

netstat -n -a |grep 3306

在Windows上,键入:

netstat -n -a |findstr 3306


Answer 6:

该解决方案的这些可能的,我遇到了这个在MCQA测试,即使我不明白哪一个是正确的!

在设置该my.cnf中“设定变量= MAX_CONNECTIONS = 200”

执行命令 “SET GLOBALmax_connections = 200”

始终使用的mysql_connect()函数,以便连接到MySQL服务器

始终使用mysql_pconnect()函数,以便连接到MySQL服务器



Answer 7:

以下是可能的解决方案:

1)通过在MySQL设置全局变量增加最大连接设置。

set global max_connection=200;

注意:它会增加服务器负载。

2),如下清空连接池:

FLUSH HOSTS;

3)检查您PROCESSLIST并杀死特定的processlist如果你不希望任何人。


你可以参考如下: -

文章链接



文章来源: MySQL Error “Too many connections”