我正在开发一个 Web 应用程序,并且由于许多连接错误消息而遇到可怕的主机 xxx 被阻止。关于这个错误有很多关于 SO 的问题,普遍的智慧是刷新主机以清除错误,然后提高 MySQL 的 max_connections 设置以避免将来出现这个问题。MySQL手册中的问题摘要如下:
允许的中断连接请求数由 max_connect_errors 系统变量的值决定。在 max_connect_errors 请求失败后,mysqld 假设有问题(例如,有人试图闯入),并阻止主机进一步连接,直到您执行 mysqladmin flush-hosts 命令或发出 FLUSH HOSTS 语句。请参见第 5.1.3 节,“服务器系统变量”。
我想更进一步,确定我的应用程序问题的根本原因。我对 MySQL 比较陌生,想知道捕获此类错误的最佳方法是什么 - MySQL 是否提供有关哪些连接或查询失败的任何日志或信息,或者我可以使用任何跟踪工具来确定这些信息?
谢谢
J.P
小智 -1
如果连接保持打开状态并且未被应用程序终止,它们也会耗尽资源,但会达到您定义的最大连接数的限制。
mysql> show processlist;
Run Code Online (Sandbox Code Playgroud)
该命令将显示是否存在指定时间的死连接,您可以通过kill命令后跟id手动杀死这些连接,或者使用下面的脚本通过cronjob杀死它们。
SECONDS_TOO_LONG=500
QUERIES_RUNNING_TOO_LONG=`/path/mysql -u user -p'pass' -ANe"SELECT COUNT(1) FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}"`
if [ ${QUERIES_RUNNING_TOO_LONG} -gt 0 ]
then
KILLPROC_SQLSTMT="SELECT GROUP_CONCAT(CONCAT('KILL QUERY ',id,';') SEPARATOR ' ') KillQuery FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}"
/path/mysql -u user -p'pass' -ANe"${KILLPROC_SQLSTMT}" | /path/mysql -u user -p'pass'
fi;
Run Code Online (Sandbox Code Playgroud)
但您必须修复您的应用程序,因为这是临时修复。