it-swarm.dev

Serwer MySQL zniknął, utrudniając import dużych zrzutów

Próbuję zaimportować duży zrzut sql (2 GB) do mojego lokalnego mysql na komputerze Mac. Byłem w stanie to zrobić w przeszłości (korzystałem z MAMP), ale teraz dostaję ERROR 2006 (HY000) w linii 7758: serwer MySQL znika za każdym razem, gdy próbuję zaimportować zrzut. Baza danych zawiera tabele innodb.

Próbowałem skopiować plik my-innodb-heavy-4G.cnf do mojego my.cnf, aby sprawdzić, czy te ustawienia by pomogły, ale bez powodzenia.

Wszelkie pomysły na to, co poprawić?

Korzystam z „Mac OS X wer. 10.6 (x86, 64-bit), Archiwum DMG” stąd: http://dev.mysql.com/downloads/mysql/

14
naxoc

Jednym z cichych zabójców połączeń MySQL jest pakiet MySQL. Nawet wątek we/wy replikacji MySQL może być ofiarą tego.

Zgodnie z dokumentacją 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 podano w Sekcja 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

  1. mysqldump jest znacznie większy
  2. przeładowanie takiego zrzutu zajmuje znacznie więcej czasu.

PODEJŚCIE 2: Zwiększ 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 z strona 99 „Understanding MySQL Internal” (ISBN 0-596-00957-7) , tutaj wyjaśniono w paragrafach 1-3:

Kod komunikacji sieciowej MySQL został napisany przy założeniu, że zapytania są zawsze rozsądnie krótkie i dlatego mogą być wysyłane i przetwarzane przez serwer w jednym kawałku, co w terminologii MySQL nazywa się pakiet. 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 wykonaj wywołanie do my_real_read () i zwróć szczególną uwagę na net_realloc () .

Ta zmienna ogranicza również długość wyniku wielu funkcji strunowych. Zobacz sql/field.cc i sql/intem_strfunc.cc w celu uzyskania szczegółów .

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ł”.

15
RolandoMySQLDBA

Ci, którzy nie odnieśli sukcesu w przypadku innych sugestii, mogą rozważyć przyjrzenie się BigDump PHP zataczał MySQL zrzut skrypt importera .

Jest to obejście dla importowania dużych zrzutów bazy danych do MySQL. Z powodzeniem wykorzystałem go do zaimportowania dużego zrzutu MySQL do mojego lokalnego środowiska programistycznego (w tym przypadku używam MAMP).

2
Marcus Barnes

Jak długo to trwa, zanim upłynie limit czasu? Pierwszym krokiem byłby zakład, aby sprawdzić wait_timeout i interactive_timeout ustawienia, aby upewnić się, że są wystarczająco duże do zaimportowania:

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;

Domyślnie jest to 8 godzin (28800), więc potencjalnie nie jest to problem. Inne oznaki tego problemu można znaleźć tutaj . Jednym z nich jest:

Aplikacja kliencka działająca na innym hoście nie ma niezbędnych uprawnień do łączenia się z serwerem MySQL z tego hosta.

Najpierw sprawdź uprawnienia, a następnie przejrzyj listę potencjalnych problemów.

2
Derek Downey

Może nie jest to „poprawne” działanie, ale może działać (załatwione, prawda?):

Spróbuj podzielić duży zrzut na wiele plików i uruchamiać je pojedynczo po kolei. Moje podejście polegałoby na rozbiciu go na pół i przetestowaniu. Następnie rozbij każdą połówkę na pół, ponownie przetestuj i tak dalej.

Jestem nieco ciekawy, czy ilość RAM, którą masz na swoim pudełku) może mieć z tym coś wspólnego. Czy MySQL ładuje cały zrzut do pamięci, kiedy chce go uruchomić? nie wiem ... ale jeśli masz tylko 2 GB RAM, a niektóre z nich są używane w systemie operacyjnym i innych aplikacjach, to może problem.

2

Tak, zazwyczaj granie z pakietami wait_timeout i max_allowed_packets pozwala mi obejść komunikat o błędzie.

2
p4guru