it-swarm-eu.dev

MySQL Chyba při čtení komunikačních paketů

V protokolech chyb MySQL vidím těchto docela málo upozornění, jako jsou tato:

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 jsem zvědavý, co toto varování znamená, nebo co to způsobuje, a zda, jak by někdo mohl řešit problém, který je způsobil. Toto je na RHEL 6.1 a MySQL Enterprise 5.5.

46
KM.

Jedním z tichých zabijáků spojení MySQL je paket MySQL.

Nejprve pojďme zjistit, co je MySQL paket.

Podle strana 99 „Porozumění interním MySQL“ (ISBN 0-596-00957-7) jsou zde odstavce 1-3 vysvětlující MySQL pakety:

MySQL síťový komunikační kód byl napsán za předpokladu, že dotazy jsou vždy přiměřeně krátké, a proto je lze na server odesílat a zpracovávat v jednom bloku, který se v terminologii MySQL nazývá paket. Server přiděluje paměť dočasné vyrovnávací paměti pro uložení paketu a vyžaduje dost, 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 dosáhne.

Kód zájmu týkající se této možnosti je uveden v sql/net_serv.cc . Podívejte se na my_net_read () , poté následujte volání 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í. Podrobnosti viz sql/field.cc a sql/intem_strfunc.cc .

Znalost této informace o paketech MySQL umožňuje vývojářům/DBA jejich velikost tak, aby pojala více BLOB uvnitř jednoho paketu, i když jsou nepříjemně velké. V takovém případě paket příliš malý způsobí problémy s otevřeným spojením.

Podle dokumentace MySQL

  • Tyto chyby můžete také získat, pokud odešlete dotaz na server, který je nesprávný nebo příliš velký. Pokud mysqld obdrží paket, který je příliš velký nebo mimo provoz, předpokládá se, že se klientovi něco pokazilo a připojení se uzavře. 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á bude také nutné zvýšit maximální velikost paketu na konci klienta. Další informace o nastavení velikosti paketu jsou uvedeny v Oddíl C.5.2.10, „Paket příliš velký“.

  • Příkaz INSERT nebo REPLACE, který vkládá mnoho řádků, může také způsobit tyto druhy chyb. Jeden z těchto příkazů odešle serveru jeden požadavek bez ohledu na počet řádků, které mají být vloženy; proto se často můžete této chybě vyhnout snížením počtu řádků odeslaných na VLOŽIT nebo VYMĚNIT.

doporučení [~ # ~] [~ # ~]

Zkuste zvýšit max_allowed_packet na mnohem větší číslo, protože výchozí hodnota je 1M. Navrhoval bych asi 10krát největší pole TEXT nebo BLOB, které máte ve svém aktuálním datovém souboru.

Chcete-li nastavit max_allowed_packet na 256M, můžete jej přidat do /etc/my.cnf nebo my.ini

[mysqld]
max_allowed_packet=256M

na pokrytí budoucích restartů mysqld. Chcete-li nainstalovat hodnotu nyní na server, spusťte toto:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Pokusit se !!!

54
RolandoMySQLDBA

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;

Vyzkoušejte výše uvedené doporučení, abyste se vyhnuli těmto varovným zprávám, a také se ujistěte, že vaše síť nemá žádné poklesy paketů.

4
Gopinath

S tímto problémem jsem se nedávno setkal po přechodu z MySQL Enterprise 5.1.x na 5.7.x, bez výrazných změn kódu aplikace 'note začaly se objevovat.

V mém případě byla hlavní příčinou objevení 'note' program ukončující připojení stále otevřená. Okolnosti, že spojení nebyla uzavřena, byly trochu více zapojeny a nesouvisely s MySQL, ale ACE, vlákny a TSS.

2
Voltaire

Tento řádek my.ini vyřešil můj problém:

log_error_verbosity=1

Odkaz toto odkaz

0
JeWoPeR

Není zde zmíněn, takže přidávám další příčinu tohoto problému. V mém případě byla při používání klienta příkazového řádku mysql chyba způsobena nízkou hodnotou 30 sekund z interactive_timeout:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_interactive_timeout
To bude přetrvávat během relací, ale ne restartování serveru.

SET GLOBAL interactive_timeout=6000;
0
lainatnavi