Ten błąd pojawia się, gdy próbuję pobrać duży plik SQL (duże INSERT
zapytanie).
mysql> source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: *** NONE ***
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: *** NONE ***
Nic w tabeli nie jest aktualizowane. Próbowałem usunąć i usunąć tabelę / bazę danych, a także ponownie uruchomić MySQL. Żadna z tych rzeczy nie rozwiązuje problemu.
Oto mój maksymalny rozmiar pakietu:
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
Oto rozmiar pliku:
$ ls -s file.sql
79512 file.sql
Kiedy próbuję innej metody ...
$ ./mysql -u root -p my_db < file.sql
Enter password:
ERROR 2006 (HY000) at line 1: MySQL server has gone away
Odpowiedzi:
Dodanie tej linii do
my.cnf
pliku rozwiązuje mój problem.Jest to przydatne, gdy kolumny mają duże wartości, które powodują problemy, wyjaśnienie znajdziesz tutaj .
źródło
set global max_allowed_packet=64*1024*1024;
- nie wymaga również restartu MySQLsudo service mysql restart
aby zmiany w pliku my.cnf zaczęły obowiązywać.Możesz zwiększyć Maksymalny dozwolony pakiet
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet
źródło
Globalna aktualizacja i ustawienia my.cnf z jakiegoś powodu nie działały dla mnie. Przekazywanie
max_allowed_packet
wartości bezpośrednio do klienta działało tutaj:źródło
--max_allowed_packet
jedynego wpływa na klienta. Rozważyć modyfikację serwera MySQL (mysqld), jak również poprzez edycjęmax_allowed_packet
w/etc/my.cnf
pliku i ponownym uruchomieniu serwera MySQL.Ogólnie błąd:
oznacza, że klient nie może wysłać pytania do serwera .
mysql
importW konkretnym przypadku podczas importowania pliku bazy danych przez
mysql
najprawdopodobniej oznacza to, że niektóre zapytania w pliku SQL są zbyt duże, aby je zaimportować i nie można ich wykonać na serwerze, dlatego klient zawiedzie przy pierwszym wystąpieniu błędu.Masz więc następujące możliwości:
Dodaj opcję siły (
-f
) dlamysql
aby kontynuować i wykonać pozostałe zapytania.Jest to przydatne, jeśli baza danych zawiera duże zapytania związane z pamięcią podręczną, które i tak nie są istotne.
Zwiększ
max_allowed_packet
iwait_timeout
w konfiguracji serwera (np~/.my.cnf
.).Zrzuć bazę danych, używając
--skip-extended-insert
opcji, aby rozbić duże zapytania. Następnie zaimportuj go ponownie.Spróbuj zastosować
--max-allowed-packet
opcję dlamysql
.Najczęstsze powody
Ogólnie błąd ten może oznaczać kilka rzeczy, takich jak:
zapytanie do serwera jest nieprawidłowe lub zbyt duże,
Rozwiązanie: Zwiększ
max_allowed_packet
zmienną .Upewnij się, że zmienna znajduje się w
[mysqld]
sekcji, a nie[mysql]
.Nie bój się używać dużych liczb do testowania (jak
1G
).Nie zapomnij zrestartować serwera MySQL / MariaDB.
Dokładnie sprawdź, czy wartość została ustawiona poprawnie przez:
Przekroczono limit czasu połączenia TCP / IP po stronie klienta.
Rozwiązanie: Zwiększ
wait_timeout
zmienną .Próbowano uruchomić zapytanie po zamknięciu połączenia z serwerem.
Rozwiązanie: Błąd logiczny w aplikacji powinien zostać poprawiony.
Wyszukiwanie nazw hosta nie powiodło się (np. Problem z serwerem DNS) lub serwer został uruchomiony z
--skip-networking
opcją.Inną możliwością jest to, że zapora blokuje port MySQL (np. Domyślnie 3306).
Bieżący wątek został zabity, więc spróbuj ponownie.
Wystąpił błąd, w wyniku którego serwer zmarł podczas wykonywania zapytania.
Klient działający na innym hoście nie ma niezbędnych uprawnień do połączenia.
I wiele innych, więc dowiedz się więcej na: B.5.2.9 Serwer MySQL odszedł .
Debugowanie
Oto kilka pomysłów debugowania na poziomie eksperckim:
Sprawdź dzienniki, np
Sprawdzić swoje połączenie przez
mysql
,telnet
lub funkcji ping (npmysql_ping
w PHP).Służy
tcpdump
do wąchania komunikacji MySQL (nie działa w przypadku połączenia przez gniazdo), np .:W systemie Linux użyj
strace
. Na BSD / Mac użyjdtrace
/dtruss
, npZobacz: Rozpoczęcie pracy z DTracing MySQL
Dowiedz się więcej o debugowaniu serwera lub klienta MySQL pod adresem: 26.5 Debugowanie i przenoszenie MySQL .
W
sql-common/client.c
celach informacyjnych sprawdź kod źródłowy w pliku odpowiedzialnym za zgłoszenieCR_SERVER_GONE_ERROR
błędu polecenia klienta.źródło
Na wszelki wypadek, aby sprawdzić zmienne, których możesz użyć
Spowoduje to wyświetlenie bieżących zmiennych, w tym przypadku max_allowed_packet, i jak ktoś powiedział w innej odpowiedzi, możesz ustawić je tymczasowo za pomocą
W moim przypadku plik cnf nie został uwzględniony i nie wiem dlaczego, więc kod SET GLOBAL naprawdę pomógł.
źródło
Rozwiązałem błąd
ERROR 2006 (HY000) at line 97: MySQL server has gone away
i pomyślnie przeprowadziłem migrację pliku> 5 GB sql, wykonując następujące dwa kroki w kolejności:Utworzono /etc/my.cnf, jak zalecili inni, z następującą zawartością:
Dołączanie flag
--force --wait --reconnect
do polecenia (tjmysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect
.).Ważna uwaga: konieczne było wykonanie obu kroków, ponieważ jeśli nie zawracałem sobie głowy wprowadzaniem zmian do pliku /etc/my.cnf, a także dodawaniem tych flag, niektórych tabel brakowało po imporcie.
Zastosowany system: OSX El Capitan 10.11.5; mysql Ver 14.14 Distrib 5.5.51 dla osx10.8 (i386)
źródło
my.cnf
należy ponownie uruchomić usługę mysql.Miałem ten sam problem, ale zmiana max_allowed_packet w pliku my.ini / my.cnf w [mysqld] załatwiła sprawę.
dodaj linię
teraz ponownie uruchom usługę MySQL po zakończeniu.
źródło
Możesz także zalogować się do bazy danych jako root (lub uprawnienia SUPER) i zrobić
nie wymaga również ponownego uruchomienia MySQL. Pamiętaj, że powinieneś naprawić
my.cnf
plik zgodnie z opisem w innych rozwiązaniach:I potwierdź zmianę po ponownym uruchomieniu MySQL:
Możesz także użyć wiersza polecenia, ale może to wymagać aktualizacji skryptów start / stop, które mogą nie przetrwać aktualizacji systemu i poprawek.
Zgodnie z życzeniem dodaję tutaj własną odpowiedź. Cieszę się, że to działa!
źródło
Rozwiązaniem jest zwiększenie wartości podanych
wait_timeout
iconnect_timeout
parametrów w pliku opcji w obszarze[mysqld]
znacznikiem.Musiałem odzyskać 400 MB kopii zapasowej mysql i to zadziałało dla mnie (wartości, których użyłem poniżej, są nieco przesadzone, ale masz rację):
źródło
Może się tu zdarzyć kilka rzeczy;
INSERT
działa długo, a klient się rozłącza. Po ponownym połączeniu nie wybiera bazy danych, stąd błąd. Jedną z opcji jest tutaj uruchomienie pliku wsadowego z wiersza poleceń i wybranie bazy danych w argumentach, tak jak to;php
lub innego języka. Po każdej długo działającej instrukcji możesz zamknąć i ponownie otworzyć połączenie, upewniając się, że jesteś podłączony na początku każdego zapytania.źródło
source
poleceniaJeśli korzystasz z komputera Mac i zainstalowałeś mysql przez brew tak jak ja, działało to.
cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf
Źródło: W przypadku instalacji homebrew mysql, gdzie jest my.cnf?
dodaj
max_allowed_packet=1073741824
do/usr/local/etc/my.cnf
mysql.server restart
źródło
Wystąpił ten błąd podczas korzystania z klastra Mysql, nie wiem, czy to pytanie dotyczy użycia klastra, czy nie. Ponieważ błąd jest dokładnie taki sam, więc podaj moje rozwiązanie tutaj. Występuje ten błąd, ponieważ nagle węzły danych ulegają awarii. Ale gdy awarie węzłów nadal można uzyskać poprawny wynik za pomocą cmd:
Mysqld również działa poprawnie, więc na początku nie rozumiem, co jest nie tak. A około 5 minut później wynik ndb_mgm pokazuje, że węzeł danych nie działa. Wtedy zdaję sobie sprawę z problemu. Spróbuj ponownie uruchomić wszystkie węzły danych, a następnie serwer mysql powróci i wszystko będzie w porządku.
Ale jedna rzecz jest dla mnie dziwna, po tym, jak straciłem serwer mysql dla niektórych zapytań, kiedy używam cmd jak
show tables
, wciąż mogę uzyskać informacje o zwróceniu33 rows in set (5.57 sec)
, ale nie wyświetla się żadna informacja o tabeli.źródło
W przypadku amazon RDS (to mój przypadek) możesz zmienić
max_allowed_packet
wartość parametru na dowolną wartość liczbową w bajtach, która ma sens dla największych danych w dowolnej wstawce, jaką możesz mieć (np .: jeśli masz jakieś 50mb wartości blob we wstawce, ustawmax_allowed_packet
do 64 M = 67108864), w nowym lub istniejącymparameter-group
. Następnie zastosuj tę grupę parametrów do instancji MySQL (może wymagać ponownego uruchomienia instancji).źródło
max_allowed_packet parameter
i ustaw odpowiedni rozmiar (lub jeśli masz naprawdę duże obiekty BLOB, po prostu ustaw maksymalną wartość 1073741824 ) powinno działać.Jeśli łączy się ponownie i uzyskuje identyfikator połączenia 2, serwer prawie na pewno się zawiesił.
Skontaktuj się z administratorem serwera i poproś go o zdiagnozowanie problemu. Żaden nie złośliwy SQL nie powinien powodować awarii serwera, a wynik działania mysqldump z pewnością nie powinien.
Prawdopodobnie jest tak, że administrator serwera popełnił duży błąd operacyjny, na przykład przypisując rozmiary buforów większe niż ograniczenia przestrzeni adresowej architektury lub więcej niż pojemność pamięci wirtualnej. Dziennik błędów MySQL prawdopodobnie zawiera pewne istotne informacje; będą monitorować to, jeśli i tak będą kompetentni.
źródło
Jest to raczej rzadki problem, ale widziałem to, gdy ktoś skopiował cały katalog / var / lib / mysql jako sposób migracji swojej bazy danych na inny serwer. Powodem, dla którego nie działa, jest to, że baza danych była uruchomiona i używa plików dziennika. Czasami nie działa, jeśli w / var / log / mysql są logi. Rozwiązaniem jest również skopiowanie plików / var / log / mysql.
źródło
Dla użytkowników Drupal 8 szukających rozwiązania problemu z niepowodzeniem importu bazy danych:
Na końcu pliku zrzutu sql mogą znajdować się polecenia wstawiające dane do tabeli „webprofiler”. To chyba plik dziennika debugowania i nie jest tak naprawdę ważny, aby witryna działała, więc wszystko to można usunąć. Usunąłem wszystkie te wstawki, w tym LOCK TABLES i UNLOCK TABLES (i wszystko pomiędzy). Jest na samym dole pliku sql. Problem opisano tutaj:
https://www.drupal.org/project/devel/issues/2723437
Ale nie ma na to rozwiązania oprócz obcinania tego stołu.
BTW Wypróbowałem wszystkie rozwiązania z powyższych odpowiedzi i nic więcej nie pomogło.
źródło
Wypróbowałem wszystkie powyższe rozwiązania, wszystkie zawiodły.
Skończyło się na użyciu
-h 127.0.0.1
zamiast domyślnegovar/run/mysqld/mysqld.sock
.źródło
Ten komunikat o błędzie pojawia się również, gdy utworzono SCHEMAT z inną KOLACJĄ niż ta, która jest używana w zrzutu. Więc jeśli zrzut zawiera
należy to również odzwierciedlić w zestawieniu SCHEMA:
Używałem utf8mb4_general_ci w schemacie, ponieważ mój skrypt pochodzi ze świeżej instalacji V8, teraz ładowanie DB na starym 5.7 uległo awarii i doprowadziło mnie do szaleństwa.
Może to pomoże ci zaoszczędzić trochę frustrujących godzin ... :-)
(MacOS 10.3, mysql 5.7)
źródło
jeśli żadna z tych odpowiedzi nie rozwiązuje problemu, rozwiązałem go, usuwając tabele i tworząc je ponownie automatycznie w ten sposób:
następnie po prostu użyj tej kopii zapasowej z db, a usunie i ponownie utworzy potrzebne tabele.
Następnie wykonaj kopię zapasową samych danych i zrób to samo, a to zadziała.
źródło
Co powiesz na użycie klienta mysql w ten sposób:
źródło