V protokolech chyb MySQL vidím těchto několik takových varování:
120611 16:12:30 [Warning] Aborted connection 2619503 to db: "db_name" user: "user_name" host: "webapp_hostname" (Got an error reading communication packets)
Nezaznamenal jsem žádnou ztrátu dat jako takovou, takže mě zajímá, co toto varování znamená nebo co jej způsobuje, a zda by se dalo vyřešit problém, který je způsobuje. Toto je na RHEL 6.1 a MySQL Enterprise 5.5.
Odpověď
Jedním z tichých zabijáků připojení MySQL je balíček MySQL.
Nejprve zjistíme, co je MySQL paket.
Podle stránky 99 „Pochopení interních funkcí MySQL“ (ISBN 0-596-00957 -7) , zde jsou odstavce 1–3 vysvětlující pakety MySQL:
Síťový komunikační kód MySQL byl napsán za předpokladu, že dotazy jsou vždy přiměřeně krátký, a proto jej lze odeslat a zpracovat serverem v jednom bloku, který se v terminologii MySQL nazývá paket . Server přiděluje paměť pro dočasnou vyrovnávací paměť pro uložení paketu a požaduje dost na to, aby se vešel úplně. Tato architektura vyžaduje preventivní opatření, aby se zabránilo vyčerpání paměti serveru — omezení velikosti paketu, čehož tato možnost dosahuje.
Kód zájmu týkající se této možnosti se nachází v sql / net_serv.cc . Podívejte se na my_net_read () a poté zavolejte na my_real_read () a věnujte zvláštní pozornost net_realloc () .
Tato proměnná také omezuje délku výsledku mnoha řetězcových funkcí. Viz sql / field.cc a sql / intem_strfunc.cc podrobnosti.
Znalost těchto MySQL paketů umožňuje vývojářům / DBA přizpůsobit je tak, aby vyhovovaly více BLOBům uvnitř jednoho balíčku, i když jsou nepříjemně velké. Příliš malý paket v tomto ohledu rozhodně způsobí problémy otevřeným připojením.
Podle Dokumentace MySQL
-
Tyto chyby můžete také získat, pokud na server odešlete nesprávný dotaz nebo příliš velký. Pokud mysqld přijme paket, který je příliš velký nebo nefunkční, předpokládá, že se klientovi něco pokazilo, a zavře spojení. Pokud potřebujete velké dotazy (například pokud pracujete s velkými sloupci BLOB), můžete zvýšit limit dotazu nastavením proměnné max_allowed_packet serveru, která má výchozí hodnotu 1 MB. Možná budete muset také zvýšit maximální velikost paketu na straně klienta. Další informace o nastavení velikosti paketu jsou uvedeny v části C.5.2.10, „Příliš velký balíček“.
-
Příkaz INSERT nebo REPLACE, který vloží velké množství řádků, může také způsobit tyto druhy chyb. Buď jeden z těchto příkazů odešle jeden požadavek na server bez ohledu na počet řádků, které mají být vloženy ; této chybě se tedy můžete často vyhnout snížením počtu řádků odeslaných na INSERT nebo REPLACE.
DOPORUČENÍ
Zkuste zvýšit max_allowed_packet na mnohem větší počet, protože výchozí hodnota je 1M. Navrhuji asi 10krát největší pole TEXT nebo BLOB ve vaší aktuální datové sadě.
Chcete-li nastavit max_allowed_packet na 256 M, můžete jej přidat do /etc/my.cnf nebo my.ini
[mysqld] max_allowed_packet=256M
k pokrytí budoucích restartů mysqld. Chcete-li nyní nainstalovat hodnotu na server, spusťte toto:
SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;
Zkuste to !!!
Komentáře
- Velmi dobré vysvětlení.
- @RolandoMySQLDBA Po vyzkoušení všech zmíněných řešení se v 5.7.28 stále zobrazuje chyba. Jakékoli tipy k dalšímu řešení problémů
Odpověď
Ve výchozím nastavení bude max_connections 100. Zkuste zvýšit konfigurační parametr
max_connections = 400, po nastavení v my.cnf restartujte server nebo jej nastavte dynamicky:
set @@global.max_connections = 400;
Zkuste výše uvedené doporučení vyhněte se těmto varovným zprávám a také zajistěte, aby vaše síť neobsahovala žádné pakety.
Odpovědět
S tímto problémem jsem se setkal nedávno po přesunu z MySQL Enterprise 5.1.x až 5.7.x , bez výrazných změn kódu aplikace se začala objevovat „ nota “.
V mém případě byla hlavní příčinou zobrazování „ poznámky “ program, který ukončil připojení stále otevřená.Okolnosti pro neuzavřená připojení byla trochu více zapojena a nesouvisela s MySQL, ale s ACE, podprocesy a TSS.
Odpověď
Není zde uvedeno, proto zahrnuji další příčinu tohoto problému. V mém případě při používání klienta příkazového řádku mysql byla chyba způsobena nízkou hodnotou 30 sekund interactive_timeout
:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_interactive_timeout
To bude přetrvávat napříč relacemi, ale ne restart serveru.
SET GLOBAL interactive_timeout=6000;
Odpověď
Na stejný problém jsem narazil s MariaDB 10.3.24. Zdá se, že varování může nastat ze všech výše uvedených důvodů a poté z některých. V mém případě to bylo kvůli záznamu v jedné z databázových tabulek, která měla pro jedno z polí prázdnou hodnotu slovníku.
+ —- + ——– + | id | config | + —- + ——– + | 3 | {} | + —- + ——– +
Jako test jsem změnil „{}“ na „()“ a zpráva byla zastavena. Jen pro případ, že to někomu pomůže.
Odpovědět
Tento řádek my.ini vyřešil můj problém:
log_error_verbosity=1
Odkaz tento odkaz
Komentáře
- Nemyslím si ', že jste vyřešili základní problém, ale jednoduše jste jej zastavili v protokolování.
- Zobrazovala se mi stejná zpráva jako " Poznámka ". Použití log_error_verbosity = 2 skutečně řeší " problém " (ale " varování " by měl být adresován, ne ignorován)