在“连接太多”的情况下,如果我做了一个service httpd restart/reload ,它会释放现有的MySQL连接吗?
有可能在重新启动Apache时,Apacheclosures数据库连接但不通知mysqld。
注意:mysqld有wait_timeout = 8小时。
简单的答案是肯定的,但不是直接的。 在任何情况下,我都会考虑将你的MySQL wait_timeout减less到更真实的30秒。
Apache是一个Web服务器,它接受HTTP连接请求并将内容提供给客户端 – 它不能本地连接到MySQL数据库。
你的连接最可能的来源是一个应用程序生成对这些请求的响应,即PHP,Java,Python等 – 你已经用php标记了你的问题,所以我将在这里假设PHP。
现在,假设你使用的是Apache的mod_php而不是PHP-FPM,那么PHP进程由Apache分支,所以当你重新启动Apache时,这些进程将被终止并重新生成。 如果您正在运行PHP-FPM,那么重新启动Apache不会像FPM作为自己的守护程序运行那样杀死任何PHP进程。
在PHP进程被mod_php杀死的情况下,它不会调用mysql_close()来直接closures连接,因此连接将保持打开wait_timeout秒。
你可以告诉Apache做一个“优雅的”重启,并允许现有线程在终止前退出,使用service httpd graceful或apachectl -k graceful 。
但是,如果您的PHP代码没有通过mysql_close()closures连接,那么这将是您的问题的根本来源,并通过任何方法重新启动Apache不会解决问题。
另外, restart与reload有重要区别 – 前者终止进程,后者只是重新加载configuration。 如果您确实想要终止进程,请使用restart 。