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.