Сначала вам нужно выполнить этот запрос:
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 с помощью подключений к БД.
wget mysqltuner.pl
скачал index.html, но это был файл perl, поэтому я переименовал его в mysqltuner.pl, и следующий cmdperl mysqltuner.pl
работал.max_connections
определяет максимальное количество одновременных подключений к MySQL. Убедитесь, что у вас есть высокое значение для этой переменной. Вы можете увеличить это значение до 300 или 400 и попытаться перезапустить MySQL после этих настроек.Также выполните
Flush status;
команду на сервере MySQl, чтобы уменьшить это значение.Я надеюсь, что эти предложения помогут.
источник
Проверьте, заполнен ли ваш диск, это может вызвать ту же ошибку:
покажет вам оставшееся место в каждом разделе, вам, вероятно, придется проверить корневой раздел
/
(или / var /, если у вас есть дополнительный раздел для этого):источник