Jednym z cichych zabójców połączeń MySQL jest pakiet MySQL. Nawet wątek we / wy replikacji MySQL może być ofiarą tego.
Według dokumentacji MySQL
Te błędy można również uzyskać, wysyłając zapytanie do serwera, które jest niepoprawne lub zbyt duże. Jeśli mysqld otrzyma pakiet, który jest zbyt duży lub nie działa, zakłada, że coś poszło nie tak z klientem i zamyka połączenie. Jeśli potrzebujesz dużych zapytań (na przykład, jeśli pracujesz z dużymi kolumnami BLOB), możesz zwiększyć limit zapytań, ustawiając zmienną max_allowed_packet serwera, która ma domyślną wartość 1 MB. Konieczne może być również zwiększenie maksymalnego rozmiaru pakietu po stronie klienta. Więcej informacji na temat ustawiania rozmiaru pakietu znajduje się w rozdziale C.5.2.10, „Pakiet za duży”.
Instrukcja INSERT lub REPLACE, która wstawia wiele wierszy, może również powodować tego rodzaju błędy. Każda z tych instrukcji wysyła pojedyncze żądanie do serwera, niezależnie od liczby wstawianych wierszy; w ten sposób często można uniknąć błędu, zmniejszając liczbę wierszy wysłanych na WSTAW lub WYMIANA.
Przynajmniej musisz upewnić się, że rozmiary pakietów zarówno dla maszyny, z której wykonałeś mysqldump, jak i dla maszyny, którą ładujesz, są identyczne.
Mogą istnieć dwa (2) podejścia:
PODEJŚCIE 1: Wykonaj mysqldump za pomocą --skip-Extended-Insert
Dzięki temu pakiet MySQL nie będzie zalewany wieloma polami BLOB, polami TEXT. W ten sposób WSTAWKI SQL są wykonywane pojedynczo. Główne wady to
- mysqldump jest znacznie większy
- przeładowanie takiego zrzutu zajmuje znacznie więcej czasu.
PODEJŚCIE 2: Zwiększyć max_allowed_packet
Może to być preferowane podejście, ponieważ implementacja tego jest po prostu restartem mysql. Zrozumienie, czym jest pakiet MySQL, może to wyjaśnić.
Zgodnie ze stroną 99 „Understanding MySQL Internals” (ISBN 0-596-00957-7) poniżej wyjaśniono w paragrafach 1-3:
Kod komunikacji sieciowej MySQL został napisany przy założeniu, że zapytania są zawsze rozsądnie krótkie, a zatem mogą być wysyłane i przetwarzane przez serwer w jednym kawałku, co w terminologii MySQL nazywa się pakietem . Serwer przydziela pamięć na tymczasowy bufor do przechowywania pakietu i żąda wystarczającej ilości, aby go całkowicie dopasować. Ta architektura wymaga środków ostrożności, aby uniknąć wyczerpania pamięci serwera --- ograniczenie rozmiaru pakietu, co osiąga ta opcja.
Kod zainteresowania związany z tą opcją znajduje się w
sql / net_serv.cc . Spójrz na my_net_read () , a następnie postępuj zgodnie z wywołaniem my_real_read () i zwróć szczególną uwagę na
net_realloc () .
Ta zmienna ogranicza również długość wyniku wielu funkcji strunowych. Szczegółowe informacje można znaleźć w sql / field.cc i
sql / intem_strfunc.cc .
Biorąc pod uwagę to wytłumaczenie, dokonywanie masowych WSTAWEK spowoduje dość szybkie ładowanie / rozładowywanie pakietu MySQL. Jest to szczególnie prawdziwe, gdy pakiet max_allowed_packet jest zbyt mały, aby mógł nadejść dany ładunek danych.
WNIOSEK
W większości instalacji MySQL zwykle ustawiam to na 256M lub 512M. Powinieneś eksperymentować z większymi wartościami, gdy ładowanie danych powoduje błędy „MySQL odszedł”.
max_allowed_packet
na 900M i--skip-extended-insert
używałem (i masz rację - to sprawia, że huuuge db-dumps), ale nadal nie działa. Podejrzewam teraz konkretną linię na zrzucie, którą prawdopodobnie mogę obejść. Ale to wciąż dziwne - zrzut można zaimportować w porządku na moim serwerze CentOS.