Як вирішити занадто багато з'єднань і фатальної помилки в mysql, що працює на vps


9

Я запускаю додаток PHPlist на своєму сервері linode, одночасно виконуючи 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/uk/table-cache. html

Але відповідно до мого використання, як збільшити пам'ять і яка максимальна пам'ять мені складна.

На своєму сервері я використовую близько 12 скриптів PHP, додаток PHP для надсилання електронних листів та основну базу даних для реєстрацій користувачів.

Будь ласка, допоможіть мені вирішити цю проблему.

Відповіді:


12

Для початку потрібно виконати цей запит:

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.


я отримую цю помилку під час спроби 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.