jaka jest rozsądna wartość dla max_allowed_packet dla Drupal 7 przy umiarkowanym ruchu?


12

Potrzebuję znać numer parkowania piłki dla tej zmiennej dla mojej strony drupal 7. Niedawno dostałem błąd „drupal” PDO. Wyjątek: SQLSTATE [08S01]: Błąd łącza komunikacyjnego: 1153. Jestem nowicjuszem w mysql i korzystam z hostingu współdzielonego. Prawdopodobnie muszę poprosić administratora o zrobienie tego za mnie.

Z góry dziękuję.


1
Moja odpowiedź pokazuje moje doświadczenie z tym związane, ale możesz uzyskać lepsze odpowiedzi na stronie dba.stackexchange.com od tych, którzy utrzymują MySQL do życia.
mpdonadio

Odpowiedzi:


12

Widziałem interesującą odpowiedź na pytanie o największy BLOB, jaki możesz mieć. Oto stwierdzenie, które widziałem w ServerFault: innodb_log_file_size i innodb_log_buffer_size łącznie muszą być większe niż dziesięciokrotność twojego największego obiektu blob, jeśli masz dużo dużych .

W oparciu o ten post ServerFault od Nils-Anders Nøttseter powinieneś przeszukać tabelę i dowiedzieć się, który BLOB jest największy, pomnożyć tę liczbę przez 11 lub więcej, i użyć tej odpowiedzi jako pakietu max_allowed_packing dalej.

To zabawne, że odpowiedziałem na inne pytanie, w którym zasugerowałem zmianę rozmiaru pakietu max_allowed, aby, mam nadzieję, rozwiązać problem .

CAVEAT

Według książki

TheBookImage

Oto, co mówi o pakietach MySQL:

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 .

Wiedza na temat pakietów MySQL pozwala DBA na ich rozmiar, aby pomieścić wiele BLOBów w jednym pakiecie MySQL, nawet jeśli są nieprzyzwoicie duże.

Jeśli chodzi o twoją sytuację, powinieneś dowiedzieć się, jaki jest największy BLOB w twojej bazie danych, pomnożyć tę liczbę przez 11 i ustawić swój max_allowed_packet na tę liczbę. Powinieneś być w stanie ustawić go na serwerze bez restartu mysql (osobiście ustawiłbym go 256M, ponieważ rozwiązałoby to inne problemy dotyczące migracji i replikacji, które wykraczają poza zakres tego forum). Aby ustawić wartość 256M dla bazy danych dla wszystkich połączeń przychodzących, uruchom to:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Następnie dodaj to ustawienie do my.cnf w [mysqld]sekcji:

[mysqld]
max_allowed_packet = 256M

Czy maksymalny dozwolony pakiet nie wpłynie również na rozmiar instrukcji wstawiania?
Buttle Butkus

@ButtleButkus Oczywiście. Dlatego większe pakiety MySQL dobrze sobie radzą z INSERTami. Należy pamiętać, że 1G to maksymalny rozmiar pakietu max_allowed_packet. Należy również pamiętać, że ustawienie max_allowed_packet na 256M nie przydziela 256M z góry. Według dev.mysql.com/doc/refman/5.6/en/… , mysqld przydziela dowolną długość bufora_sieci jako początkowy rozmiar pakietu MySQL. Pakiet stopniowo rośnie do rozmiaru ustawionego przez max_allowed_packet. Dlatego można ustawić duży max_allowed_packet. WKŁADY pokochają cię za to.
RolandoMySQLDBA

Nigdy nie ustawiłem niczego zbliżonego do tego rozmiaru, mimo że mamy kilka maszyn z 32G RAM. Jednak dławiła się na nim aplikacja, a ja zwiększyłem ją do domyślnej 32M (1M?) I to zadziałało. Może jeszcze go zwiększę, jeśli to nie zaszkodzi. Ale czy aplikacje powinny sprawdzać pakiet max_allowed_packet i rozbijać wstawki na części, aby uniknąć przekroczenia tego limitu? Jakie są wady tego podejścia? Być może powinienem opublikować to pytanie na stronie stosu dba.
Buttle Butkus

Czy mógłbyś bardziej szczegółowo wyjaśnić, dlaczego powinniśmy pomnożyć przez 11? Połączony post dotyczy buforów innodb - jaki to ma związek z rozmiarem pakietu?
SystemParadox

4

Zaczerpnięte ze strony Wymagania serwera bazy danych Drupal :

Konieczne może być ustawienie zmiennej systemowej max_allowed_packet na co najmniej 16M. Niektóre tanie plany hostingowe ustawiają tę wartość za niską (domyślna wartość MySQL to tylko 1M). W takim przypadku może być konieczne wybranie lepszego planu hostingowego. Wartość 1M może być wystarczająca dla Drupala 5.

Powinno być w porządku dla witryny na dzielonym hostingu.


1
Łał!! Wymagania serwera Drupal oficjalnie mówią, że to 16 mln !! Nigdy nie byłem tego świadomy. Pamiętam o tym następnym razem. Wielkie dzięki za udostępnienie tych informacji. Chciałbym zaznaczyć to najlepszą odpowiedzią !!
shivams

2

Ustawienie może być trochę trudne max_allowed_packet. Nie znalazłem jeszcze metody obliczenia tej wartości. Zazwyczaj wpadam na to podczas próby przywrócenia migawki bazy danych, która zawiera wiersze z {cache}tabel.

Kiedy mam ten problem, wybiorę wartość pomiędzy 4M a 8M. Podnoszę wartość, dopóki się nie zatrzyma. Nie wiem jednak, czy współdzielony host zmieni dla ciebie tę wartość.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.