繁体   English   中英

MySQL错误“连接太多”

[英]MySQL Error “Too many connections”

我正在使用MySQL 5.0作为由GoDaddy(linux)托管的站点。

我正在对我的网络应用程序进行一些测试,突然间我注意到页面刷新的速度非常慢。 最后,经过漫长的等待,我得到了一个页面,上面写着“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个用户,我应该升级到“Deluxe”,它允许一次100个连接。 在某一天,可能有大约30个用户一次访问我的网站,所以我认为100将是一个更安全的赌注。 你们同意吗?

共享主机提供商通常允许同一用户的少量同时连接。

你的代码做的是:

  • 打开与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服务器时出现Too many connections错误,则表示其他客户端正在使用所有可用连接。

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

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

... 如果我是对的,就是这样 ,你无法解决问题:只要该服务器上的数据库/用户太多而且max_connection设置为200,你就会继续受苦...... 。


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

我有大约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

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

如果你有这个...最多你将需要支持与apache进程一样多的连接。 您是否可以更改max_connections设置?

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

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

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

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

在Linux上,键入:

netstat -n -a |grep 3306

在Windows上,键入:

netstat -n -a |findstr 3306

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

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

执行命令“SET GLOBALmax_connections = 200”

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

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

以下是可能的解决方案:

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

set global max_connection=200;

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

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

FLUSH HOSTS;

3)如果你不想要任何一个,请检查你的processList并杀死特定的进程列表。


你可以参考这个: -

文章链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM