在 'too many connections' 错误的情况下,如果我做 a service httpd restart/reload
,它会释放现有的 MySQL 连接吗?
是否有可能在重新启动 Apache 时,Apache 关闭数据库连接但不通知 mysqld。
注意:mysqld 的 wait_timeout = 8 小时。
在 'too many connections' 错误的情况下,如果我做 a service httpd restart/reload
,它会释放现有的 MySQL 连接吗?
是否有可能在重新启动 Apache 时,Apache 关闭数据库连接但不通知 mysqld。
注意:mysqld 的 wait_timeout = 8 小时。
简短的回答是肯定的,但不是直接的。无论如何,我会考虑将您的 MySQL 减少
wait_timeout
到更现实的时间,例如 30 秒。Apache 是一个网络服务器,它接受 HTTP 连接请求并将内容返回给客户端——它不能本地连接到 MySQL 数据库。
您的连接最可能的来源是生成对这些请求的响应的应用程序,即 PHP、Java、Python 等 - 您已经标记了您的问题,
php
所以我将在这里假设 PHP。现在,还假设您使用 Apache 的 mod_php 而不是 PHP-FPM,那么 PHP 进程由 Apache 分叉,因此当您重新启动 Apache 时,这些进程将被杀死并重新生成。如果您正在运行 PHP-FPM,重新启动 Apache 不会杀死任何 PHP 进程,因为 FPM 作为自己的守护进程运行。
在通过 mod_php 杀死 PHP 进程的情况下,它不会
mysql_close()
直接调用关闭连接,因此连接会保持打开wait_timeout
几秒钟。service httpd graceful
您可以使用or告诉 Apache 进行“优雅”重启并允许现有线程在终止之前退出apachectl -k graceful
。但是,如果您的 PHP 代码没有通过
mysql_close()
then 关闭连接,那将是您问题的最终根源,并且通过任何方法重新启动 Apache 都无法解决问题。restart
此外,与vs进行的一个重要区别reload
- 前者终止进程,后者只是重新加载配置。如果您真的想终止进程,请使用restart
.