Для початку потрібно виконати цей запит:
SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
Тут буде вказано список усіх користувачів, які мають привілей SUPER . Більшість користувачів, які виконують обробку БД, пов'язану з додатками, не потребують цього привілею. Відповідно до документації MySQL , ті, хто має привілей SUPER, можуть:
- Запустіть ЗМІНИТЬ МАЙСТЕР ДО для управління координатами реплікації
mysqladmin kill
Вбити або вбити теми, що належать до інших облікових записів
- PURGE BINARY LOGS для системного видалення бінарних журналів
- Внесіть зміни конфігурації, використовуючи 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
можна лише входити в систему. Зрештою, якби всі та його бабуся мали привілей СУПЕР, це забороняло б root@localhost
коли-небудь з'єднуватися попереду всіх інших. Якщо max_connections становить 200, і вам потрібно підняти його до 300 без перезавантаження mysqld, ви можете динамічно збільшити max_connections за допомогою цієї команди:
mysql> SET GLOBAL max_connections = 300;
Це дозволить отримати більше ефективних підключень негайно, але не просто довільно збільшувати кількість примх. Ви повинні переконатися, що у mysql достатньо оперативної пам’яті, щоб забезпечити збільшення.
CAVEAT: Якщо ви зміните max_connections динамічно на 300, будь ласка, поставте його в /etc/my.cnf
[mysqld]
max_connections=300
Ви можете запустити mysqltuner.pl на своєму сервері DB MySQL. Якщо у вас його немає, виконайте наступне:
cd
wget mysqltuner.pl
perl mysqltuner.pl
Третій рядок у розділі "Показники ефективності" має це
-------- 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,4М на одну нитку? Це множиться на max_connections. У цьому прикладі це було б максимум приблизно 10,8 G оперативної пам’яті. Тому щоразу, коли ви накопичуєте max_connections, слід запускати mysqltuner.pl і перевіряти, чи натискаєте ви ОС на занадто багато пам'яті.
У будь-якому випадку, обмеження того, хто має привілеї SUPER, надає таким користувачам можливість пом’якшити затоплення mysqld за допомогою підключення до DB.