Разорвать соединения MySQL на общем хосте? - PullRequest
1 голос
/ 16 сентября 2008

Я использую Grid Server MediaTemple (общий / сетевой хостинг) для запуска некоторых сайтов MySQL / PHP, которые я пишу, и заметил, что я не закрывал одно из моих подключений MySQL, что вызвало ошибку моего сайта:

"Too Many Connections"

Я не могу войти в систему, чтобы закрыть подключения вручную.

Можно ли как-нибудь закрыть открытые соединения с помощью сценария или другого типа команды?.

Должен ли я просто подождать?

Ответы [ 5 ]

1 голос
/ 16 сентября 2008

вслепую в терминальных соединениях не способ решить эту проблему. Сначала вы должны понять, почему у вас кончаются связи. выбрана ли ваша настройка max_connections для правильного соответствия количеству максимальных / ожидаемых пользователей? Вы используете постоянные соединения, когда они вам действительно не нужны? и т.д.

1 голос
/ 16 сентября 2008

Если вы вообще не можете войти в MySQL, вам, вероятно, придется связаться с вашим хостинг-провайдером, чтобы разорвать соединения.

Если вы можете использовать оболочку MySQL, вы можете использовать команду show processlist для просмотра соединений, а затем команду kill для удаления соединений.

По моему опыту, зависшие соединения SQL, как правило, остаются такими, к сожалению.

0 голосов
/ 16 сентября 2008

Если вы можете получить доступ к командной строке с достаточными правами, перезапустите сервер MySQL или сервер Apache (при условии, что вы используете Apache) - потому что, вероятно, он сохраняет соединения открытыми. После того, как вы успешно закрыли соединения, убедитесь, что вы не используете постоянные соединения из PHP (общее мнение таково, что это не приводит к значительному увеличению производительности, но имеет всевозможные проблемы - как вы уже испытывали) а в некоторых случаях - например, используя PostgreSQL - он может даже значительно замедлить ваш сайт!).

0 голосов
/ 16 сентября 2008

Что ж, если вы не можете проникнуть через соединение, я не знаю, но если вы можете случайно проникнуть внутрь, в 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"
0 голосов
/ 16 сентября 2008

Убедитесь, что вы закрываете соединения с помощью своего PHP-кода. Кроме того, вы можете увеличить максимально допустимые соединения в /etc/my.cnf.

max_connections=500

Наконец, вы можете войти в приглашение mysql и набрать show status или show processlist для просмотра различной статистики на вашем сервере.

Если ничего не помогает, перезапуск демона сервера должен очистить постоянные соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...