终止共享主机上的MySQL连接?
我正在使用MediaTemple的Grid Server(共享/网格托管)运行我正在编写的某些MySQL / PHP网站,并注意到我没有关闭我的MySQL连接之一,这导致我的网站出错:
"Too Many Connections"
我无法登录任何地方以手动关闭连接。
这是使用脚本或者其他类型的命令关闭打开的连接的任何方法吗?
我应该等吗?
解决方案
回答
如果我们根本无法登录MySQL,则可能必须联系托管服务提供商以终止连接。
如果可以使用MySQL Shell,则可以使用show processlist命令查看连接,然后使用kill命令删除连接。
不幸的是,根据我的经验,挂起的SQL连接倾向于保持这种状态。
回答
确保我们正在关闭与PHP代码的连接。另外,我们可以增加/etc/my.cnf中允许的最大连接数。
max_connections=500
最后,我们可以登录到mysql提示符,然后键入" show status"或者" show processlist"以查看服务器的各种统计信息。
如果其他所有方法均失败,则重新启动服务器守护程序应清除持久连接。
回答
好吧,如果我们永远无法通过连接进行潜入,我不知道,但是如果我们偶尔可以进行潜入,那么在Ruby中,它将接近:
require 'mysql' mysql = Mysql.new(ip, user, pass) processlist = mysql.query("show full processlist") killed = 0 processlist.each { | process | mysql.query("KILL #{process[0].to_i}") } puts "#{Time.new} -- killed: #{killed} connections"
回答
如果我们可以使用足够的权限访问命令行,请重新启动MySQL服务器或者Apache(假设我们使用的是Apache)服务器,因为它可能会保持连接打开状态。成功关闭连接后,请确保我们没有使用来自PHP的持久连接(一般的看法是,它不会带来任何显着的性能提升,但是它会遇到我们遇到的各种问题,在某些情况下,例如使用PostgreSQL它甚至可能会大大降低网站速度!)。
回答
盲目地终止连接不是解决此问题的方法。首先,我们需要了解连接不足的原因。选择的max_connections设置正确匹配最大/预期用户数吗?当我们真的不需要持久连接时,我们是否在使用它们?等等。