Ошибка MySQL «Слишком много соединений»

Я использую MySQL 5.0 для сайта, размещенного GoDaddy (linux).

Я проводил тестирование в своем веб-приложении, и вдруг заметил, что страницы очень быстро обновляются. Наконец, после долгого ожидания, я попал на страницу, в которой говорилось что-то вроде строк «Ошибка MySQL, слишком много соединений …», и он указывал на мой файл config.php, который соединяется с базой данных.

Я только что подключался к базе данных, других пользователей. На каждой из моих страниц я включаю файл config.php вверху и закрываю соединение mysql в конце страницы. Между ними может быть несколько запросов. Я боюсь, что я недостаточно закрываю связи mysql (mysql_close ()).

Однако, когда я пытаюсь закрыть их после запуска запроса, я получаю ошибки соединения на странице. Мои страницы – это PHP и HTML. Когда я пытаюсь закрыть запрос, кажется, что следующий не будет подключаться. Должен ли я включить config.php снова после закрытия, чтобы подключиться?

Эта ошибка напугала меня, потому что через 2 недели около 84 человек начали использовать это веб-приложение.

Благодарю.

РЕДАКТИРОВАТЬ:

Вот несколько псевдокодов моей страницы:

require_once('../scripts/config.php'); <?php mysql_query.. if(this button is pressed){ mysql_query... } if(this button is pressed){ mysql_query... } if(this button is pressed){ mysql_query... } ?> some html.. .. .. .. .. <?php another mysql_query... ?> some more html.. .. .. <?php mysql_close(); ?> 

Я понял, что так, каждый раз, когда открывается страница, открывается соединение, а затем соединение закрывается, когда страница загружается. Затем соединение открывается снова, когда кто-то нажимает кнопку на странице и так далее …

РЕДАКТИРОВАТЬ:

Хорошо, так что я только что вышел с телефона с GoDaddy. По-видимому, с моим пакетом Economy я ограничился только 50 подключениями одновременно. Хотя моя проблема сегодня произошла, и только я обращался к сайту, они сказали, что раньше у них были проблемы с сервером. Однако, видя, что у меня будет 84 пользователя для моего веб-приложения, я, вероятно, должен перейти на «Делюкс», который позволяет одновременно устанавливать 100 подключений. В определенный день может быть около 30 пользователей, обращающихся к моему сайту за раз, поэтому я думаю, что 100 будет более безопасным. Вы, ребята, согласны?

Поставщики общих хостингов обычно допускают довольно небольшое количество одновременных подключений для одного и того же пользователя.

Что делает ваш код:

  • открыть соединение с сервером MySQL
  • сделайте это (создайте страницу)
  • закройте соединение в конце страницы.

Последний шаг, когда это делается в конце страницы, не является обязательным : (цитируя mysql_close ):

Использование mysql_close () обычно не требуется, поскольку непостоянные открытые ссылки автоматически закрываются в конце выполнения скрипта.

Но обратите внимание, что вы, вероятно, не должны использовать постоянные подключения …

Два совета:

  • используйте mysql_connect insead mysql_pconnect (уже ОК для вас)
  • Установите четвертый параметр mysql_connect в false (уже ОК для вас, поскольку это значение по умолчанию) : (цитируя руководство):

Если второй вызов выполняется с mysql_connect () с теми же аргументами, новая связь не будет установлена, но вместо этого будет возвращен идентификатор ссылки уже открывшейся ссылки.

Параметр new_link изменяет это поведение и заставляет mysql_connect () всегда открывать новую ссылку, даже если mysql_connect () был вызван ранее с теми же параметрами.


Что может вызвать проблему?

Возможно, вы пытаетесь получить доступ к нескольким страницам параллельно (используя, например, несколько вкладок в вашем браузере) , которые будут одновременно имитировать нескольких пользователей, использующих веб-сайт?

Если у вас много пользователей, использующих сайт одновременно, а код между mysql_connect и закрытием соединения занимает много времени, это будет означать одновременное открытие нескольких подключений … И вы достигнете предела : – (

Тем не менее, поскольку вы единственный пользователь приложения, учитывая, что разрешено до 200 одновременных подключений, происходит что-то странное …


Ну, думая о « слишком большом количестве соединений » и « max_connections » …

Если я правильно помню, max_connections не ограничивает количество подключений, которые вы можете открыть на сервере MySQL, но общее количество подключений, которые могут быть открыты для этого сервера, любым , кто подключается к нему .

Цитирование документации MySQL на слишком много соединений :

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

Количество разрешенных подключений контролируется системной переменной max_connections. Его значение по умолчанию – 100. Если вам нужно поддерживать больше соединений, вы должны установить большее значение для этой переменной.

Таким образом, на самом деле проблема может быть не от вас и от вашего кода (который выглядит нормально, на самом деле) : он может «просто» быть тем, что вы не единственный, кто пытается подключиться к этому серверу MySQL (помните, «общий хостинг») , и что слишком много людей используют его одновременно …

… И если я прав, и это так , вы ничего не можете сделать, чтобы решить проблему: до тех пор, пока на этом сервере слишком много баз данных / пользователей, и что max_connection установлен в 200, вы будете продолжать страдать. ,

В качестве опоры: прежде чем возвращаться в GoDaddy, спрашивая их об этом, было бы неплохо, если бы кто-то мог проверить, что я только что сказал ^^

У меня было около 18 месяцев работы с этим ( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-error/ )

Решения, которые у меня были (что применимо к вам), в конце концов:

  1. настройте базу данных в соответствии с MySQLTuner .
  2. дефрагментация таблиц еженедельно на основе этой публикации

Дефрагментация сценария bash из сообщения:

 #!/bin/bash # Get a list of all fragmented tables FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND Data_free > 0` | grep -v '^+' | sed 's,t,.,' )" for fragment in $FRAGMENTED_TABLES; do database="$( echo $fragment | cut -d. -f1 )" table="$( echo $fragment | cut -d. -f2 )" [ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database; OPTIMIZE TABLE $table;" > /dev/null 2>&1 done 

Убедитесь, что вы не используете постоянные соединения. Обычно это плохая идея.

Если у вас есть это … В самом деле вам нужно будет поддерживать столько же соединений, сколько у вас есть процессы apache. Можете ли вы изменить настройку max_connections?

Вы полностью уверены, что сервер базы данных полностью посвящен вам?

Войдите в datbase как root и используйте «SHOW PROCESSLIST», чтобы узнать, кто подключен. Идеально подключите это в свою систему мониторинга, чтобы просмотреть, сколько подключений со временем и оповещения, если их слишком много.

Максимальные соединения с базой данных могут быть настроены в my.cnf, но следите за нехваткой памяти или адресного пространства.

Если у вас есть доступ к оболочке, используйте netstat, чтобы узнать, сколько сокетов открыто в вашей базе данных и откуда они взяты.

В Linux введите:

 netstat -n -a |grep 3306 

В окнах введите:

 netstat -n -a |findstr 3306 

Решение может быть одним из них, я столкнулся с этим в тесте MCQA, даже я не понял, какой из них прав!

Установите это в my.cnf "set-variable = max_connections = 200"

Выполните команду «SET GLOBALmax_connections = 200»

Всегда используйте функцию mysql_connect () для подключения к серверу mysql

Всегда используйте функцию mysql_pconnect () для подключения к серверу mysql

Возможны следующие решения:

1) Увеличьте максимальную настройку соединения, установив глобальную переменную в mysql.

 set global max_connection=200; 

Примечание. Это увеличит нагрузку на сервер.

2) Очистите пул соединений, как показано ниже:

FLUSH HOSTS;

3) проверьте свой список процессов и уничтожьте определенный список процессов, если вы не хотите их.

Вы можете сослаться на это:

ссылка на статью