Błąd 2006 o nazwie MySQL Sever zniknął oznacza, że serwer odmówił połączenia, mimo że jest uruchomiony. Istnieją tylko trzy znane powody, dla których pojawia się ten błąd. Pierwszym powodem jest przeciążenie serwera. Czas oczekiwania upłynął. Drugi powód - klient wysłał pakiet, który jest zbyt bolesny. Trzecim powodem jest to, że serwer nie został w pełni zainicjowany. W dalszej części rozważymy szczegółowo, z jakich powodów pojawia się błąd i jak sobie z nim radzić.
Zazwyczaj błąd pojawia się podczas próby połączenia się z bazą danych za pomocą PHP, klienta konsoli lub w przypadku korzystania z PhpMyAdmin:
Przeanalizujmy każdą sytuację osobno.
Jak wspomniano na początku tego artykułu, jedną z możliwych przyczyn jest upłynięcie czasu oczekiwania. Może się zdarzyć, że serwer został przeciążony i nie może poradzić sobie z obciążeniem - przetwarzaniem wszystkich połączeń. Aby zrozumieć, jak długo trwają żądania serwera, możesz użyć dowolnego klienta konsoli i połączyć się z serwerem. Jeśli możesz to zrobić, wykonaj dowolne żądanie. Jeśli przetwarzanie zapytań zajmuje zbyt dużo czasu, można zoptymalizować MySQL za pomocą specjalnego skryptu MySQLTuner. Zazwyczaj należy zwiększyć rozmiar puli silnika InnoDB poprzez ustawienie parametru innodb_buffer_pool_size
. Optymalna wartość jest określana za pomocą powyższego skryptu.
Jeśli wynosi ona 800 megabajtów (może to być dowolny inny rozmiar), należy ją ustawić:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Istnieje jeszcze jeden sposób na rozwiązanie problemu. W tym celu należy zwiększyć czas odpowiedzi serwera. Aby wykonać to zadanie, należy zmienić parametr wait_timeout
. Jest to czas w sekundach, przez który należy czekać na odpowiedź z serwera.
Na przykład:
wait_timeout=500
Wprowadzając zmiany, nie zapomnij o ponownym uruchomieniu serwera w następnej kolejności:
$ sudo systemctl restart mysql
Lub:
$ sudo systemctl restart mariadb
Gdy klient użytkownika utworzy zbyt wiele pakietów, serwer wygeneruje ten błąd. Dostępny rozmiar pakietu (wartość maksymalna) można zwiększyć za pomocą parametru max_allowed_packet
.
Na przykład:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Zwróć szczególną uwagę na klienta, ponieważ jeśli wysyła wiele żądań, najwyraźniej robisz coś nie tak. Przynajmniej nie generuj zapytań do MySQL przy użyciu pętli for
.
Jeśli zdecydujesz się wdrożyć MySQL lub MariaDB w Dockerze, przygotuj się na napotkanie podobnego błędu. Początkowa inicjalizacja kontenera wymaga nieco więcej wolnego czasu. Jeśli nie pozwolisz kontenerowi dokończyć inicjalizacji, zatrzymując go i uruchamiając, baza danych zawsze zwróci ten błąd. Rozwiązaniem jest całkowite usunięcie danych kontenera z bazy danych.
Odbywa się to w następujący sposób:
$ docker-compose down
lub:
$ docker rm mysql-container
Następnie należy usunąć pamięć masową (wolumen) z nieprawidłowo zainicjalizowaną bazą danych. Na początku jednak należy przejrzeć listę wszystkich magazynów:
$ docker volume ls
Po usunięciu:
$ docker volume rm volume_name
Teraz można rozpocząć inicjalizację aplikacji, wystarczy poczekać, aż serwer bazy danych poinformuje, że jest gotowy i można się z nim połączyć.