Najpierw musisz uruchomić to zapytanie:
SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
Spowoduje to wyświetlenie listy wszystkich użytkowników, którzy mają uprawnienia SUPER . Większość użytkowników przetwarzających aplikacje związane z bazą danych nie wymaga tego uprawnienia. Zgodnie z Dokumentacją MySQL osoby z uprawnieniami SUPER mogą wykonywać następujące czynności:
- Uruchom CHANGE MASTER TO, aby kontrolować współrzędne replikacji
- KILL lub
mysqladmin kill
zabić wątki należące do innych kont
- WYPEŁNIJ DZIENNIKI BINARNE, aby systematycznie usuwać dzienniki binarne
- Wprowadź zmiany konfiguracji za pomocą SET GLOBAL, aby zmodyfikować globalne zmienne systemowe
- polecenie debugowania mysqladmin
- włączanie lub wyłączanie rejestrowania
- przeprowadzanie aktualizacji, nawet jeśli włączona jest zmienna systemowa * read_only *
- uruchamianie i zatrzymywanie replikacji na serwerach podrzędnych
- specyfikacja dowolnego konta w atrybucie DEFINER przechowywanych programów i widoków
- TUTAJ JEST NAJWAŻNIEJSZY DLA TWOJEGO PROBLEMU: Umożliwia połączenie (jeden raz), nawet jeśli limit połączenia kontrolowany przez zmienną systemową max_connections jest osiągnięty.
Musisz zalogować się jako root @ localhost i odebrać uprawnienia SUPER w następujący sposób:
UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;
Gdy to zrobisz, za każdym razem, gdy wszyscy użytkownicy zalewają połączenia mysql, tylko root@localhost
logować się. W końcu, jeśli wszyscy i jego babcia mieliby SUPER przywilej, uniemożliwiłoby to root@localhost
kiedykolwiek połączenie przed wszystkimi innymi. Jeśli maksymalna liczba połączeń wynosi 200 i musisz ją podnieść do 300 bez konieczności ponownego uruchamiania mysqld, możesz dynamicznie zwiększać liczbę połączeń za pomocą tego polecenia:
mysql> SET GLOBAL max_connections = 300;
Umożliwi to natychmiastowe zwiększenie liczby połączeń, ale nie tylko arbitralnie zwiększy liczbę pod wpływem kaprysu. Musisz upewnić się, że mysql ma wystarczającą ilość pamięci RAM, aby pomieścić wzrost.
CAVEAT: Jeśli zmienisz dynamicznie max_connections na 300, umieść go w /etc/my.cnf
[mysqld]
max_connections=300
Możesz uruchomić mysqltuner.pl na swoim serwerze MySQL DB. Jeśli go nie masz, uruchom następujące polecenie:
cd
wget mysqltuner.pl
perl mysqltuner.pl
Trzecia linia pod Performance Metrics ma to
-------- 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)
Widzisz 5,4 mln na wątek? To jest mnożone przez max_connections. W tym przykładzie byłoby to maksymalnie około 10,8 GB pamięci RAM. Dlatego za każdym razem, gdy podbijasz max_connections, powinieneś uruchomić mysqltuner.pl i sprawdzić, czy naciskasz system operacyjny za dużo pamięci.
W każdym razie ograniczenie, kto ma uprawnienia SUPER, daje takim użytkownikom możliwość złagodzenia zalania mysqld za pomocą DB Connections.