Слишком много подключений к БД, препятствующих выполнению некоторых запросов

У меня возникла проблема, из-за которой пользователи моего веб-сайта недавно начали получать сообщение об ошибке:

Не удается подключиться к локальному серверу MySQL через сокет '/var/lib/mysql/mysql.sock' (2)

Я знаю, что строки подключения в коде верны, так как пользователи могут запрашивать страницы просмотра базы данных, которые извлекают информацию и отправляют созданную пользователем информацию в базу данных. Это наводит меня на мысль, что ошибка является результатом одновременного открытия слишком большого количества соединений. Код - это php, и каждая страница php имеет собственные команды mysql_open и mysql_close, поэтому мне интересно, не слишком ли много соединений открыто одновременно. Я не знаю, возможно ли это, учитывая, что каждый день на сайт заходит всего 20 человек. Мой вопрос: как я могу узнать, сколько соединений открыто в любой момент времени, и могу ли я как-то отслеживать количество соединений, открытых в течение случайного дня? Я относительно новичок в этом, и я использую phpmyadmin для управления базой данных. Если на самом деле слишком много соединений, как лучше всего с этим справиться?

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

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

Заранее спасибо за идеи.


person Jen    schedule 09.02.2010    source источник
comment
Вам нужно проверить свои журналы MySQL и выяснить, что происходит на самом деле.   -  person Phil Wallach    schedule 09.02.2010


Ответы (4)


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

person Mihai Toader    schedule 09.02.2010
comment
Хотите верьте, хотите нет, но как бы просто это ни было, проблема была именно в этом. Большое спасибо. - person Jen; 18.02.2010

Создайте пул подключений с помощью «пула подключений», который может помочь управлять количеством разрешенных подключений. Также в MYSQL есть команда, которая должна сообщить вам, сколько соединений существует.

Вот одна команда, которая может сработать: show processlist;

Тогда вы увидите затяжные процессы. У каждого есть идентификатор, и вы можете убить их по идентификатору процесса прямо в мониторе MySQL, набрав:

kill 2309344;

Надеюсь, что это помогает немного.

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

person Daniel Kivatinos    schedule 09.02.2010
comment
Я думал, что пул соединений должен сэкономить время на создании и открытии соединения с БД по запросу, потому что они были созданы (и, следовательно, объединены в пул) заранее... идея состоит не в том, чтобы ограничить соединения, а в том, чтобы сделать транзакции более эффективными, без необходимости открывать соединения каждый раз. - person Russell; 09.02.2010

show status; из клиента mysql покажет вам статистику. в частности, вы хотите взглянуть на max_used_connections, я думаю.

person prodigitalson    schedule 09.02.2010

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

person ysth    schedule 09.02.2010