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.
wget mysqltuner.pl
pobrało plik index.html, ale był to plik perla, więc zmieniłem jego nazwę na mysqltuner.pl i następne polecenie cmdperl mysqltuner.pl
działało.max_connections
określa maksymalną liczbę równoczesnych połączeń z MySQL. Upewnij się, że masz wysoką wartość dla tej zmiennej. Możesz zwiększyć tę wartość do 300 lub 400 i spróbować ponownie uruchomić MySQL po tych ustawieniach.Wykonaj także
Flush status;
polecenie na serwerze MySQl, aby zmniejszyć tę wartość.Mam nadzieję, że te sugestie pomogą.
źródło
Sprawdź, czy dysk jest pełny, może to powodować ten sam błąd:
pokaże ci pozostałe miejsce na każdej partycji, prawdopodobnie musisz sprawdzić partycję root
/
(lub / var / w przypadku, gdy masz do tego dodatkową partycję):źródło