【发布时间】:2010-09-09 07:25:19
【问题描述】:
我正在使用 MediaTemple 的网格服务器(共享/网格托管)来运行我正在编写的一些 MySQL/PHP 站点,并注意到我没有关闭我的一个 MySQL 连接,这导致我的站点出错:
"Too Many Connections"
我无法在任何地方登录以手动关闭连接。
是否可以使用脚本或其他类型的命令关闭打开的连接?
我应该等吗?
【问题讨论】:
标签: sql mysql database connection
我正在使用 MediaTemple 的网格服务器(共享/网格托管)来运行我正在编写的一些 MySQL/PHP 站点,并注意到我没有关闭我的一个 MySQL 连接,这导致我的站点出错:
"Too Many Connections"
我无法在任何地方登录以手动关闭连接。
是否可以使用脚本或其他类型的命令关闭打开的连接?
我应该等吗?
【问题讨论】:
标签: sql mysql database connection
如果您根本无法登录 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 设置是否选择正确匹配最大/预期用户的数量?当你真的不需要它们时,你是否在使用持久连接?等等
【讨论】: