Как решить слишком много соединений и фатальную ошибку в MySQL, работающей на VPS


9

Я запускаю приложение PHPlist на моем сервере линоде, одновременно запуская 12 PHP-скриптов, каждый из которых открывает соединение MySQL. Теперь, когда я обращаюсь к PHPlist, он часто показывает эту ошибку:

Неустранимая ошибка. Извините, сервер в данный момент слишком занят, повторите попытку позже.

Когда я пытаюсь получить доступ к phpMyAdmin, он показывает мне ошибку # 1040. Вывод моих PHP-скриптов, которые выполняются через cronзадания, показывает:

Предупреждение PHP: mysqli_connect (): (HY000 / 1040): слишком много соединений

Я использую стек LAMP на сервере с phpMyAdmin; topвыход в терминальных шоу с mysqldиспользованием 100-130% CPU. Когда я пытаюсь решить эту проблему, я получил несколько подсказок:

  • Увеличьте переменную max_connection: я использую 200 (по умолчанию 100)
  • Открытый кеш таблиц: 512 (по умолчанию 400)

Есть много переменных для установки, но я не могу определить, какие именно, я получаю некоторые ссылки: слишком много соединений и http://dev.mysql.com/doc/refman/5.5/en/table-cache. HTML

Но в зависимости от моего использования, как увеличить объем памяти, и какой максимальный объем памяти мне сложно.

На моем сервере я использую около 12 сценариев PHP, приложение PHPlist для отправки электронных писем и основную базу данных для регистрации пользователей.

Пожалуйста, помогите мне решить эту проблему.

Ответы:


12

Сначала вам нужно выполнить этот запрос:

SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';

Это будет список всех пользователей, которые имеют привилегию SUPER . Большинству пользователей, которые выполняют обработку БД, связанную с приложением, эта привилегия не требуется. Согласно документации MySQL , те, кто имеет привилегию SUPER, могут делать следующее:

  • Запустите CHANGE MASTER TO для контроля координат репликации
  • KILL или mysqladmin killчтобы убить темы, принадлежащие другим учетным записям
  • Очистить двоичные журналы для системного удаления двоичных журналов
  • Внесите изменения в конфигурацию, используя SET GLOBAL для изменения глобальных системных переменных.
  • команда отладки mysqladmin
  • включение или отключение ведения журнала
  • выполнение обновлений, даже если включена системная переменная * read_only *
  • запуск и остановка репликации на подчиненных серверах
  • указание любой учетной записи в атрибуте DEFINER хранимых программ и представлений
  • ЗДЕСЬ НАИБОЛЕЕ ВАЖНО ДЛЯ ВАШЕЙ ПРОБЛЕМЫ:: Позволяет подключиться (один раз), даже если достигнут предел подключения, управляемый системной переменной max_connections .

Вам нужно будет войти как root @ localhost и отозвать привилегию SUPER следующим образом:

UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;

После того, как вы это сделаете, всякий раз, когда все пользователи затопляют подключения mysql, только root@localhostможет войти В конце концов, если бы каждый и его бабушка имели привилегию SUPER, это не позволило бы root@localhostкогда-либо соединиться впереди всех остальных. Если max_connections равно 200 и вам нужно увеличить его до 300 без перезапуска mysqld, вы можете динамически увеличить max_connections с помощью этой команды:

mysql> SET GLOBAL max_connections = 300;

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

ПРЕДУПРЕЖДЕНИЕ: если вы динамически меняете max_connections на 300, пожалуйста, поместите его в /etc/my.cnf

[mysqld]
max_connections=300

Вы можете запустить mysqltuner.pl на вашем БД MySQL. Если у вас его нет, запустите следующее:

cd
wget mysqltuner.pl
perl mysqltuner.pl

3-я строка в метрике производительности имеет это

-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)

Видите 5,4M на тему? Это умножается на max_connections. В этом примере это будет максимум около 10,8 ГБ ОЗУ. Поэтому каждый раз, когда вы увеличиваете max_connections, вы должны запускать mysqltuner.pl и проверять, нажимаете ли вы на ОС из-за слишком большого объема памяти.

В любом случае, ограничение того, кто имеет привилегии SUPER, дает таким пользователям возможность смягчить затопление mysqld с помощью подключений к БД.


я получаю эту ошибку при попытке выполнить perl mysqltuner.pl «Попытка использовать учетные данные для входа из учетной записи обслуживания Debian, но они не удаются».
Шашанк

Я пытаюсь это на моем локальном сервере Ubuntu, он показывает максимальное использование памяти, но на моем VPS, это показывает сбой, и я не могу войти в phpmyadmin, но войти в систему с помощью терминала mysql
Shashank

Этот cmd wget mysqltuner.plскачал index.html, но это был файл perl, поэтому я переименовал его в mysqltuner.pl, и следующий cmd perl mysqltuner.plработал.
MotsManish

2
  1. Глобальная переменная max_connectionsопределяет максимальное количество одновременных подключений к MySQL. Убедитесь, что у вас есть высокое значение для этой переменной. Вы можете увеличить это значение до 300 или 400 и попытаться перезапустить MySQL после этих настроек.
  2. Разработайте свое приложение так, чтобы соединение MySQL оставалось открытым в течение очень короткого периода времени.
  3. Вы должны также проверить, что клиентский код не использует постоянные соединения (такие как mysql_pconnect ()) неправильно.

Также выполните Flush status;команду на сервере MySQl, чтобы уменьшить это значение.

Я надеюсь, что эти предложения помогут.


0

Проверьте, заполнен ли ваш диск, это может вызвать ту же ошибку:

df -h

покажет вам оставшееся место в каждом разделе, вам, вероятно, придется проверить корневой раздел /(или / var /, если у вас есть дополнительный раздел для этого):

df -h /
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.