MySQL错误“连接太多”

时间:2009-07-29 18:55:14

标签: php mysql connection

我正在使用MySQL 5.0来访问由GoDaddy(linux)托管的网站。

我正在对我的网络应用进行一些测试,突然之间我注意到这些页面的刷新速度非常慢。最后,经过漫长的等待,我到了一个页面,上面写着“MySQL错误,连接太多......”的内容,它指向我连接数据库的config.php文件。

我刚刚连接数据库,没有其他用户。在我的每个页面上,我在顶部包含config.php文件,并关闭页面末尾的mysql连接。两者之间可能存在多个查询。我担心我没有足够关闭mysql连接(mysql_close())。

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

这个错误吓到了我,因为在2周内,大约有84人开始使用这个网络应用程序。

感谢。

编辑:

以下是我页面的一些伪代码:

 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个用户,我应该升级到“Deluxe”,它允许一次100个连接。在某一天,可能有大约30个用户一次访问我的网站,所以我认为100将是一个更安全的赌注。你们同意吗?

7 个答案:

答案 0 :(得分:31)

共享托管服务提供商通常允许同一用户进行少量的同步连接。

您的代码的作用是:

  • 打开与MySQL服务器的连接
  • 做它的东西(生成页面)
  • 关闭页面末尾的连接。

最后一步,在页面末尾完成时不是强制性 :(引用mysql_close手册):

  

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

但请注意,你可能不应该使用持久连接......

两个提示:

  • 使用mysql_connect mysql_pconnect (已经可以为你)
  • 将mysql_connect的第四个参数设置为false (已经可以,因为它是默认值) :(引用手册):
  

如果再次拨打电话   mysql_connect()与此相同   参数,没有新的链接   建立,但相反,链接   已打开链接的标识符   将被退回。

     

new_link   参数修改此行为和   使mysql_connect()始终打开一个   新链接,即使是mysql_connect()   以前叫过同样的   参数。



那会导致什么问题?

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

如果有许多用户同时使用该网站,并且mysql_connect与关闭连接之间的代码需要大量时间,则意味着会同时打开许多连接...并且你将达到极限: - (

尽管如此,由于您是该应用程序的唯一用户,考虑到您允许多达200个同时连接,因此有一些奇怪的事情......



好吧,想一想“连接太多”和“max_connections”......

如果我没记错的话,max_connections不会限制可以打开MySQL服务器的连接数,但连接总数可以bo打开了该服务器,任何与之连接的人都

Too many connections上引用MySQL的文档:

  

如果您获得太多连接   尝试连接到时出错   mysqld服务器,这意味着所有   可用的连接正在使用中   其他客户。

     

允许的连接数是   由max_connections控制   系统变量。它的默认值是   100.如果需要支持更多连接,则应设置更大的连接   此变量的值。

所以,实际上,问题可能不是来自你或你的代码(看起来很好,实际上):它可能“只是”你不是唯一一个试图连接到那个MySQL服务器(请记住,“共享主机”),并且有太多人同时使用它...

... 如果我是对的,那就是,你无法解决问题:只要该服务器上的数据库/用户太多而且{{ 1}}设置为200,你将继续痛苦......


作为旁注:在回到GoDaddy询问他们之前,如果有人可以验证我刚刚说的话会很好^^

答案 1 :(得分:3)

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

我最终得到的解决方案(适用于你)是:

  1. 根据MySQLTuner调整数据库。
  2. 根据此post
  3. 每周对表格进行碎片整理

    从帖子中对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
    

答案 2 :(得分:2)

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

如果你有这个...最多你需要支持与apache进程一样多的连接。你能改变max_connections设置吗?

答案 3 :(得分:2)

您是否完全确定数据库服务器完全专用于您?

以root用户身份登录数据库并使用“SHOW PROCESSLIST”查看谁已连接。理想情况下,将其连接到监控系统中,以查看一段时间内有多少连接,并在有太多连接时发出警报。

可以在my.cnf中配置最大数据库连接,但要注意内存或地址空间不足。

答案 4 :(得分:2)

如果您有shell访问权限,请使用netstat查看为您的数据库打开了多少个套接字以及它们来自何处。

在Linux上,输入:

netstat -n -a |grep 3306

在Windows上,输入:

netstat -n -a |findstr 3306

答案 5 :(得分:1)

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

在my.cnf中设置“set-variable = max_connections = 200”

执行命令“SET GLOBALmax_connections = 200”

始终使用mysql_connect()函数连接到mysql服务器

始终使用mysql_pconnect()函数连接到mysql服务器

答案 6 :(得分:0)

以下是可能的解决方案:

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

set global max_connection=200;

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

2)清空连接池,如下所示:

FLUSH HOSTS;

3)检查您的processList并删除特定的进程列表,如果您不想要任何进程列表。


你可以参考: -

article link