MySQL数据库不时需要刷新表。我能编写一些东西来解决这个问题吗

时间:2011-10-18 06:48:24

标签: php mysql linux

我遇到了一个问题,我希望有人可以帮助我。

目前,当我们的脚本(Java和PHP)尝试连接到localhost mysql数据库时,我们不时会收到错误。

由于许多连接错误,主机'myhost'被阻止;使用'mysqladmin flush-hosts'解锁。

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

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

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

  1. PHP网站
  2. 使用chron作业运行PHP文件
  3. 一些java应用程序作为套接字侦听器运行,侦听传入端口连接并使用mysql数据库检查用户凭据并检查未完成的消息。
  4. 我们通常可以在任何时间打开300到600个套接字连接,并且这些连接的平均活动大约是每秒1-3个请求。

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

    我的问题是:

    1. 我可以做些什么来自动轮询mysql数据库,所以如果发生这种情况我可以自动刷新数据库以清除
    2. 这是否可能与服务器备份有关。似乎巧合的是,在备份发生期间95%的时间都会发生这种情况。
    3. 任何其他可能有用的想法。与其他网站的链接,或者我可以向我们的主人提供帮助的问题。
    4. 我们目前正在使用Apache运行 PHP版本5.2.6-1 + lenny9 服务器。

      如果需要更多信息,请告知我们。感谢。

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

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

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

      更新: 所以我将max_connections限制从100改为200,并在php.ini中将mysql.persistant变量从On更改为Off。现在两个晚上运行服务器已经完成,主要是与mySql数据库的连接。我在服务器上有一个1GB的RAM,但它似乎永远不会接近。另外看看我的munin日志,连接似乎永远不会达到200分,但我的日志文件中出现错误,如

      1. SQLException:连接太多
      2. 成功发送到服务器的最后一个数据包是0毫秒前。驱动程序未收到来自服务器的任何数据包。
      3. SQLException:null,来自服务器的消息:“无法创建新线程(错误12);如果您没有可用内存,可以查阅手册以了解可能的操作系统相关错误。
      4. SQLState :: SQLException:HY000,VendorError :: SQLException:1135

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

有人建议我发布这个问题的答案,虽然我从未真正对它进行排序。

最后,我最终实现了一个Java连接池类,它使我能够共享连接,同时保持我想要的最大连接数的上限。还有人建议我增加RAM并增加最大连接数。我做了这两件事虽然他们只是这个问题的乐队。我们最终也搬迁了托管服务提供商,因为我们所处的并不是非常合作。

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

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