[英]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_close
的手册):
通常不需要使用mysql_close(),因为非持久性打开链接会在脚本执行结束时自动关闭。
但请注意,您可能不应该使用持久连接...
两个提示:
mysql_connect
的INSEAD mysql_pconnect
(已经为您确认) 如果使用相同的参数对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/ )
我最终得到的解决方案(适用于你)是:
从帖子中对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.