Co faktycznie kontroluje ustawienie „max_allowed_packet” w MySQL?

8

mysqldumpUsuwaliśmy problemy z bazą danych przez ostatnie cztery godziny, dzięki awarii, która nie była wystarczająco błędna. Otrzymywaliśmy te błędy:

mysqldump: Error 2020: Got packet bigger than "max_allowed_packet" bytes when dumping table "search_dataset" at row: 68014

Co do cholery robi to ustawienie? Oczywiście nie jest to rozmiar pakietu IP, ponieważ mam teraz ustawiony na 32M. Dlaczego to istnieje?

Plutor
źródło

Odpowiedzi:

7

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 .

Jest to prawdopodobnie najbardziej kompletne wyjaśnienie pakietu max_allowed_packet, jaki kiedykolwiek widziałem. Napisałem te 3 akapity bezpośrednio z książki.

RolandoMySQLDBA
źródło
Dzięki za opublikowanie tego. Wydaje się sugerować, że „pakiet” oznacza „pakiet IP”.
Randolf Richardson
Świetna odpowiedź. Wydaje mi się, że to jest tak blisko, jak dochodzę do prawdziwej odpowiedzi. (Nadal jestem całkiem pewien, że to nie odnosi się do pakietów IP To nie wspomina nigdzie IP i wierzę 65535 bajtów jest zazwyczaj ograniczenie świecie rzeczywistym dla nawet rozdrobnione pakietów IP.).
Plutor
1

Dokumentacja wyjaśnia to tutaj szczegółowo:

„Maksymalny rozmiar jednego pakietu lub dowolnego wygenerowanego / pośredniego łańcucha. ...”

Dokumentacja dotyczy również obiektów BLOB i tego, jak to ustawienie się z nimi wiąże.

Randolf Richardson
źródło
To tak naprawdę nie odpowiada na moje pytanie. Co to jest pakiet w tym kontekście? Czy to rzeczywiście pakiet IP? Czy nie ma lepszego sposobu na przechwycenie zniekształconych danych niż prosty limit bajtów?
Plutor
O ile nie zdefiniują „pakietu” jako czegoś innego (czego nie wydaje się robić w dokumentacji), uzasadnione jest oczekiwanie, że „pakiet” odnosi się do pakietu IP.
Randolf Richardson
Definicję znalazłem w mojej książce. Jako odpowiedź dodałem fragment tej książki.
RolandoMySQLDBA