MySQL 错误“连接太多”

2022-08-30 18:22:07

我正在将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次。虽然我今天的问题发生在只有我访问该网站的情况下,但他们说他们早些时候遇到了一些服务器问题。但是,鉴于我的Web应用程序将拥有84个用户,我可能应该升级到“Deluxe”,它允许一次连接100个连接。在某一天,可能一次大约有30个用户访问我的网站,所以我认为100个用户会更安全。你们同意吗?


答案 1

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

你的代码做什么是:

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

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

通常不需要使用mysql_close(),因为非持久性开放链接会在脚本执行结束时自动关闭。

但请注意,您可能无论如何都不应该使用持久连接...

两个提示:

  • 使用 insead (已经确定适合您)mysql_connectmysql_pconnect
  • 将mysql_connect的第四个参数设置为false(已经可以了,因为它是默认值):(引用手册):

如果对具有相同参数的mysql_connect() 进行第二次调用,则不会建立新链接,而是返回已打开的链接的链接标识符。

new_link 参数修改此行为,并使 mysql_connect() 始终打开新链接,即使之前使用相同的参数调用了 mysql_connect()。



那么,是什么原因导致问题呢?

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

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

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



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

如果我没记错的话,并不限制您可以打开的MySQL服务器的连接数量,而是可以由连接到该服务器的任何人打开的连接到该服务器的连接总数max_connections

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

如果在尝试连接到 mysqld 服务器时收到“连接数过多”错误,则表示其他客户端正在使用所有可用连接。

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

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

...如果我是对的,那就是,你无能为力来解决这个问题:只要该服务器上有太多的数据库/用户,并且设置为200,你就会继续受苦......max_connection


顺便说一句:在回到GoDaddy询问他们之前,如果有人能验证我刚才所说的话,那就太好了^^


答案 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

推荐