MySQL Ошибка "Слишком много соединений" - PullRequest
20 голосов
/ 29 июля 2009

Я использую 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. Очевидно, с моим экономичным пакетом я ограничен 50 соединениями одновременно. В то время как моя проблема произошла сегодня, когда я только заходил на сайт, они сказали, что раньше у них были проблемы с сервером. Однако, учитывая, что у меня будет 84 пользователя для моего веб-приложения, мне, вероятно, следует перейти на «Deluxe», который допускает 100 подключений одновременно. В тот или иной день на моем сайте одновременно может быть около 30 пользователей, поэтому я думаю, что 100 будет более безопасной ставкой. Ребята, вы согласны?

Ответы [ 7 ]

31 голосов
/ 30 июля 2009

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

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

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

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

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

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

Два совета:

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

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

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



Тогда что может вызвать проблемы?

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

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

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



Хорошо, подумав о " слишком много соединений " и "max_connections" ...

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

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

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

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

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

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


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

3 голосов
/ 26 августа 2010

У меня было около 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
2 голосов
/ 30 июля 2009

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

В Linux введите:

netstat -n -a |grep 3306

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

netstat -n -a |findstr 3306
2 голосов
/ 29 июля 2009

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

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

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

2 голосов
/ 29 июля 2009

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

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

1 голос
/ 27 февраля 2011

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

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

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

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

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

0 голосов
/ 19 сентября 2017

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

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

set global max_connection=200;

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

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

FLUSH HOSTS;

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


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

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

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