Подтвердить что ты не робот

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

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

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

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

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

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

Спасибо.

EDIT:

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

 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(); ?>

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

EDIT:

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Два совета:

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

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

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



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

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

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

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



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

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

Указание документации MySQL на Слишком много соединений:

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

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

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

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


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

Ответ 2

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

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

  • настроить базу данных в соответствии с MySQLTuner.
  • дефрагментировать таблицы в неделю на основе post

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

#!/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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

В Linux введите:

netstat -n -a |grep 3306

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

netstat -n -a |findstr 3306

Ответ 6

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

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

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

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

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

Ответ 7

Возможные решения:

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

set global max_connection=200;

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

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

FLUSH HOSTS;

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


Вы можете обратиться к этому: -

ссылка статьи