MySQL数据库需要每隔一段时间刷新表.我可以写一些东西来解决这个问题


MySQL database needs a flush tables every now and again. Can I script something to resolve this?

我遇到了一个问题,希望有人能帮我解决。

当前,当我们的脚本(Java和PHP)试图连接到本地主机mysql数据库时,我们会时不时地收到一个错误。

主机'myhost'被阻塞,因为许多连接错误;使用'mysqladmin flush-hosts'解除阻塞。

这个问题似乎主要发生在清晨。经过大量的搜索,找出为什么会发生这种情况,我终于得出结论,这可能是由于我们的托管公司在这个时候运行他们的备份过程。我的理论是,在这个备份过程中(这也是我们最繁忙的时期),我们最终耗尽了所有的连接,所以出现了这个错误。

我已经和我们的主机谈过改变这些备份发生的时间,但他们说这是不可能的,那只是备份开始的时间,以确保他们在当天及时完成(尽管我们已经通知他们我们的关键时期是在备份发生的精确时间)。

我连接到服务器的东西是:

    PHP网站
  1. PHP文件使用计时作业运行
  2. 两个java应用程序作为套接字侦听器运行,侦听传入端口连接,并使用mysql数据库检查用户凭据和检查未完成的消息。

我们通常在任何时间打开300 - 600个套接字连接,这些连接的平均活动大约是每秒1-3个请求。

我还安装了monit和munin与一些mysql插件在服务器上,希望他们可以帮助自动解决这个问题,但这些没有看到解决这个问题。

我的问题是:

  1. 我可以做些什么来自动轮询mysql数据库,所以如果发生这种情况,我可以自动刷新数据库以清除
  2. 这是否可能与服务器备份有关?这似乎是一个巧合,95%的时间发生在备份期间。
  3. 还有其他有用的想法吗?链接到其他网站,或者我可以向我们的主人提出问题来帮助解决。

我们目前运行在一个PHP版本5.2.6-1+lenny9服务器与Apache。

如果需要更多的信息,请告诉我。谢谢。

更新:我在一个共享的虚拟主机上操作,我很确定我关闭了我的网站连接,因为我有这个代码在我的数据库类

  function __destruct() {
    @mysql_close($this->link);
  }

我很确定我没有使用持久连接通过我的PHP脚本,因为我连接到数据库的@mysql_connect命令。

更新:所以我改变了max_connections限制从100 - 200,我改变了mysql。php.ini中从On到Off的持久变量。现在,服务器已经运行了两个晚上,主要是连接到mySql数据库。我在服务器上有一个1GB的内存,但它似乎从来没有接近过。再看看我的munin日志连接似乎从来没有达到200的标志,但我得到错误在我的日志文件,如

  1. SQLException: Too many connections
  2. 最后一个成功发送到服务器的报文是0毫秒前。处理步骤驱动程序没有收到来自服务器的任何数据包。
  3. SQLException: null,来自服务器的消息:"Can't create a new thread (errno 12);如果你没有用完可用内存,你可以查阅手册,了解可能与操作系统相关的错误。
  4. SQLState:: SQLException: HY000, VendorError:: SQLException: 1135

我们在使用MySQL作为后端进行大型电子商务安装时遇到了类似的问题。我建议你修改MySQL实例的"max_connections"设置,然后(如果必要的话)在启动MySQL之前使用"ulimit"修改文件描述符的数量(我们在/etc/init.d/MySQL中使用"ulimit -n 32768")。

虽然我从来没有真正把它排序过,但有人建议我发布一个答案。

最后,我最终实现了一个Java连接池类,它使我能够共享连接,同时保持我想要的最大连接数的上限。还建议我增加RAM并增加最大连接数。我做了这两件事,尽管它们只是解决问题的权宜之计。我们最后也换了一些主机提供商,因为他们不太合作。

在这些小的实现之后,我没有注意到这个问题发生了至少8个月,这对我来说已经足够好了。

随着时间的推移,其他建议也必须实现线程池功能,但是当前的需求并不需要这个需求。