题
我使用MySQL5.0为一个网站,由编码(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(); ?>
我认为,这种方式,每次打开页,连接打开,然后关闭连接网页时完成的负载。然后,连接打开了再次当某人点击一个按钮页,等等...
编辑:
好了,所以我刚打电话编码.显然,与我国经济包,我仅限于50连接在一段时间。虽然我的问题今天发生了只有我访问该网站,他们说,他们具有某些服务器问题的更早。然而,看看如何在我要有84用户对于我的网应用程序,我也许应该升级到"豪华",其中允许对于100个连接在一段时间。在某一天,可能有大约30的用户访问我站在一段时间,所以我认为100将是一个更安全的选择。你们同意吗?
解决方案
公共托管服务提供商通常允许一个非常小的金额可以同时连接的相同的用户。
什么你的代码是:
- 打开连接到MySQL server
- 做这东西(产生页)
- 关闭连接在结束页。
最后步骤,做的时候结束时页是不是 强制性的 :(引用 mysql_close
's manual):
使用mysql_close()通常不是 有必要,作为非永久开放 链接是自动封闭 结束脚本的执行。
但你可能不应该使用持久连接,无论如何...
两个提示:
- 使用
mysql_connect
欧洲工商管理学院的mysql_pconnect
(已经确定为你) - 设定的第四个参数的mysql_connect假 (已经确定,因为它是默认值) :(引用的手册):
如果第二次呼叫了 mysql_connect()有相同的 参数,没有新的链接会 建立,但是,链接 标识已经打开链接 将返回。
The new_link 参修改该行为, makes mysql_connect()always open a 新的链接,即使mysql_connect()was 叫之前有相同的 参数。
什么可能导致的问题,然后呢?
也许你试图访问几页平行 (使用多个标签在你的浏览器,为实例), ,这将模拟的几个用户使用网站在同一时间?
如果你有许多用户使用网站在同一时间和之间的代码 mysql_connect
和闭幕连接需要大量的时间,这将意味着许多连接在同一时间打开...你就会达到极限 :-(
仍然,因为你是唯一应用程序的用户,考虑到你有多达200同时允许连接,有一些奇怪的事...
好了,思考"太多的连接"和"max_connections
"...
如果我没有记错的话, max_connections
没有限制连接的数量 你的 可以打开MySQL Server,但是 总数的连接 可博打开那个服务器 任何人都连接到它.
引用MySQL的文件 太多的连接 :
如果你得到太多的连接 错误的时候你尝试连接到 该服务器,这意味着所有 可用连接是在使用通过 其他客户。
允许的连接数是 通过控制max_connections 系统变量。它的默认值 100.如果你需要支持更多的连接,你应该设置一个更大的 值对于这一变量。
所以,实际上,问题可能不是来自你也不是你的代码 (这看起来不错,实际上) :它可能会"只有"你是不是唯一一个尝试连接到MySQL server (要记住,"公共托管"), 有太多的人使用它在同一时间...
...和 如果我是对的这是那个, 有什么可以解决的问题:只要有太多的数据库/用户对该服务器, max_connection
被设定为200,你将继续受苦...
作为一个旁注:之前回到编码要求他们有关,它将是很好的如果有人可以验证什么,我只是说^^
其他提示
我有大约18个月的处理时间( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-误差/ )
我最终得到的解决方案(适用于你)是:
- 根据 MySQLTuner 调整数据库。
- 根据此帖子每周对表格进行整理碎片整理 醇>
从帖子中对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&quot; set-variable = max_connections = 200&quot;
中设置此项执行命令“SET GLOBALmax_connections = 200”
始终使用mysql_connect()函数连接到mysql服务器
始终使用mysql_pconnect()函数连接到mysql服务器
以下是可能的解决方案:
1)通过在mysql中设置全局变量来增加最大连接设置。
set global max_connection=200;
注意:这会增加服务器负载。
2)清空连接池,如下所示:
FLUSH HOSTS;
3)检查您的processList并删除特定的进程列表,如果您不想要任何进程列表。
,点击 你可以参考: -