Ресурс Mysql временно недоступен
Я вижу несколько таких ошибок во время высокой загрузки:
mysql_connect() [<a
href='function.mysql-connect'>function.mysql-connect</a>]: [2002] Resource
temporarily unavailable (trying to connect via
unix:///var/lib/mysql/mysql.sock)
Из того, что я могу сказать, сервер mysql не попадает в лимит максимальных подключений, но там что-то еще останавливает его от обслуживания запроса. Какие еще ограничения были бы для MySQL?
Я запускаю RHEL 6.2 64bit с MySQL 5.5.21
Ответы
Ответ 1
Я все еще не нашел, какие ограничения он наносил, но мне удалось обойти эту проблему. Возникла проблема с нашей таблицей сеансов (в vbulletin), которая использует движок MEMORY. Индексами для этой таблицы были HASH, и, таким образом, когда vbulletin очищал эту таблицу один раз в час, он блокировал бы таблицу достаточно долго, чтобы задержать другие запросы, и превзойти mysql до предела своих ресурсов.
Изменяя индексы на BTREE, это позволило MySQL быстрее удалять строки из таблицы сеансов и избегать любых ограничений, которые были достигнуты ранее. Ошибки начались только тогда, когда мы обновили наш сервер master db до MySQL 5.5, поэтому я предполагаю, что таблицы MEMORY обрабатываются по-разному в последней версии.
См. http://www.mysqlperformanceblog.com/2008/02/01/performance-gotcha-of-mysql-memory-tables/ для получения информации о скорости увеличения с использованием индексов BTREE над HASH для MEMORY.
Ответ 2
Предположим, что ваша система в настоящее время основана на Unix (как указано в вашей постановке проблемы). Если это правильно, вот набор проблем, с которыми вы можете столкнуться:
-
Вы исчерпали memory, доступный для MySQL.
Это наиболее вероятная проблема, с которой вы столкнулись. Для каждого соединения в пуле соединений MySQL требуется, чтобы память функционировала, и если этот ресурс исчерпан, дальнейшие соединения не могут быть сделаны. Разумеется, следы памяти и максимальные размеры пакетов различных операций могут быть настроены в ваш эквивалент my.cnf
, если вы обнаружите, что это проблема.
Вот дополнительный поток, который может помочь там, но вы также можете рассмотреть возможность использования более простых инструментов для профилирования, таких как top
, чтобы получить хорошую оценку шара о том, что происходит.
-
Вы исчерпали файловые дескрипторы, доступные вашей учетной записи пользователя MySQL.
Еще одна распространенная проблема: если вы пытаетесь обслуживать запросы, требующие файла IO выше границы 1024 (по умолчанию), вы столкнетесь с ситуациями, когда операция просто терпит неудачу. Это связано с тем, что в большинстве систем определяется мягкое и жесткое ограничение количества дескрипторов открытых файлов, которые каждый пользователь может иметь в наличии, и прохождение этого порога может вызвать проблемы.
Это обычно будет иметь ряд очевидных признаков, выраженных в ваших файлах журналов. Проверьте /var/log/messages
и сопоставимые каталоги (например, /var/log/mysql
, чтобы узнать, можете ли вы найти что-нибудь интересное.
-
Вы столкнулись с сценарием livelock или deadlock, где ваш поток неудовлетворен.
Следствие об исчерпании памяти и файлового дескриптора, потоки могут выходить из строя, если вы перешагнули вычислительную нагрузку, которую ваша система может обрабатывать. Он не будет вызывать это сообщение об ошибке, но в будущем это нужно соблюдать.
-
В вашей системе заканчиваются PID, доступные fork
.
Другой распространенный сценарий: fork
доступно только столько PID, доступных для использования в любой момент времени. Если ваша система просто переместилась, она перестанет быть в состоянии обслуживать запросы.
Простейшая проверка для этого заключается в том, чтобы увидеть, могут ли какие-либо другие службы подключаться к машине. Например, попытка SSH в поле и обнаружение того, что вы не можете, - это большой ключ.
-
Прокси-сервер или диспетчер соединений вверх по потоку исчерпали ресурсы и прекратили запросы на обслуживание.
Если у вас есть уровень обслуживания между вашим клиентом и MySQL, он проверяет, не разбился ли он, не повесился или не стал неустойчивым. Приведенный выше совет.
-
Ваш портмодер исчерпал себя после 65 536 соединений.
Вряд ли, но опять же, возможный случай истощения. Проверка тривиального сервисного соединения, как указано выше, - ehm, также лучший порт захода здесь.
Вкратце: это сценарий исчерпания ресурса, включая сервер, просто "вниз". Вам нужно будет профилировать свою систему, чтобы узнать, что вы блокируете. Все сообщение об ошибке дает нам в этом случае тот факт, что ресурс недоступен для клиента - нам нужно будет увидеть больше информации о сервере, чтобы определить более адекватное средство.
Ответ 3
Боже, это может быть так много. Может случиться так, что пространство буфера сокета исчерпано. Возможно, что mysql
не принимает соединения так быстро, как они поступают, и достигнут предел отставания (хотя я ожидаю, что вы получите сообщение об ошибке "Отказано в соединении", я точно не знаю, что вы получите для сокета домена Unix). Это может быть любая из вещей, на которые указывает @MrGomez.
Поскольку вы используете Apache и MySQL на одном сервере, и это проблема при высокой нагрузке, вполне возможно, что Apache голодает из системы какого-либо ресурса, и вы просто не видите (замечаете?) сброшенный/не удалось выполнить входящие соединения/запросы в ваших журналах.
Используете ли вы пул соединений? Если нет, я бы начал там.
Я также искал бы ошибки в журналах и syslog Apache примерно в то же время, что и ошибка mysql_connect, и посмотрю, что еще может получиться. Я бы рекомендовал, чтобы MySQL перешел на отдельный выделенный выделенный сервер.
Ответ 4
В моем случае я работал с типами данных JSON
с помощью PDO
(PHP Driver). Я использовал fetch
для получения одного элемента, но забыл добавить LIMIT 1
в запрос. Добавление его решило проблему.