Назад | Перейти на главную страницу

Не удается подключиться к серверу MySQL после слишком большого количества подключений?

Сегодня мой сервер БД достиг максимального количества подключений, и мои веб-приложения (на другом сервере) показывают сообщение об ошибке «слишком много подключений». После этого я перезапустил сервер MySQL, но появилась новая проблема. Приложения начинают показывать другую ошибку: «Не удается подключиться к серверу MySQL« IP-адрес сервера БД »на (4)». Я могу подключиться к MySQL локально и без проблем выполнять запросы. Я могу telnet с веб-сервера на порт № 3306 на сервере БД. Я очистил файл журнала ошибок MySQL и снова провел тест, но не обнаружил никаких проблем. Я перезапустил оба сервера, чтобы убедиться, что все соединения отключены, но после перезапуска серверов все еще существует та же проблема. Сеть в порядке, нет сетевых проблем между обоими серверами, нет сбоев пакетов, нет задержек, нет сообщений об ошибках. Через три часа сервер БД вернулся в нормальное состояние!

каковы предполагаемые причины этой проблемы? Почему сервер снова заработал через три часа? есть ли связанный с этим параметр тайм-аута?

 Edit: My application is PHP and web-server is apache2.

Похоже, что ваши разработчики неправильно закрывают свои соединения в коде. В C # это будет примерно так:

var cn = new MySqlConnection(" connection string " );
var cmd = new MySqlCommand(" sql string ", cn);

cn.Open():
cmd.ExecuteNonQuery();
cn.Close();

Приведенный выше код в корне ошибочен, потому что ошибка в sql-коде приведет к исключению, и, следовательно, код для закрытия вашего соединения никогда не будет достигнут. Вместо этого им нужно написать это так:

MySqlConnection cn;
try
{
    cn = new MySqlConnection(" connection string ");
    var cmd = new MySqlCommand(" sql string ", cn);

    cn.Open():
    cmd.ExecuteNonQuery();
}
finally
{
    cn.Close();
}

И на самом деле у C # есть несколько лучших шаблонов, которые они действительно должны использовать. Но это иллюстрирует точку зрения, которая применима и к другим языкам - независимо от вашей платформы, клиентский код для закрытия ваших соединений с базой данных. должен происходят таким образом, что возникают исключения.

Может быть, вы могли бы запустить FLUSH HOSTS;

В соответствии с http://dev.mysql.com/doc/refman/5.0/en/flush.html

Очищает таблицы кэша хоста. Вам следует очистить таблицы хостов, если некоторые из ваших хостов меняют IP-адрес или если вы получаете сообщение об ошибке. Хост «host_name» заблокирован. Когда больше чем max_connect_errors ошибок происходит последовательно для данного хоста при подключении к серверу MySQL, MySQL предполагает, что что-то не так, и блокирует хост от дальнейших запросов на соединение. Очистка таблиц хоста разрешает дальнейшие попытки подключения с хоста. См. Раздел C.5.2.6, «Хост 'host_name' заблокирован». Вы можете запустить mysqld с --max_connect_errors = 999999999, чтобы избежать этого сообщения об ошибке

Я бы также посмотрел на снижение следующего:
join_buffer_size
sort_buffer_size
read_buffer_size
read_rnd_buffer_size

и увеличивая max_connections