A MySQL hibanaplókban ezt a néhány figyelmeztetést látom:

120611 16:12:30 [Warning] Aborted connection 2619503 to db: "db_name" user: "user_name" host: "webapp_hostname" (Got an error reading communication packets) 

A Haven önmagában nem vett észre adatvesztést, ezért kíváncsi vagyok, mit jelent ez a figyelmeztetés, vagy mi okozza, és hogyan lehet megoldani az ezeket okozó problémát. Ez az RHEL 6.1 és a MySQL rendszereken található Vállalati 5.5.

Válasz

A MySQL Connections egyik csendes gyilkosa a MySQL csomag.

Először derítsük ki, mi az a MySQL csomag.

A “MySQL belső használatának megértése” (ISBN 0-596-00957) 99. oldal szerint. -7) , itt vannak az 1-3. Bekezdések, amelyek a MySQL csomagokat magyarázzák:

A MySQL hálózati kommunikációs kódot abból a feltételezésből írtam, hogy a lekérdezések mindig ésszerűen rövid, és ezért egy kiszerelésben elküldhető és feldolgozható a szerver számára, amelyet a MySQL terminológiájában csomagnak hívnak. A kiszolgáló egy ideiglenes pufferhez rendeli a memóriát a csomag tárolásához, és annyit kér, hogy teljes egészében elférjen benne. Ez az architektúra elővigyázatosságot igényel annak elkerülése érdekében, hogy a kiszolgáló memóriája elfogyjon – a csomag méretének korlátozása, amit ez az opció megvalósít.

Az opcióval kapcsolatos érdekes kód a sql / net_serv.cc . Vessen egy pillantást a my_net_read () oldalra, majd kövesse a my_real_read hívást () és fordítson különös figyelmet a net_realloc () .

Ez a változó korlátozza számos string függvény eredményének hosszát is. Lásd: sql / field.cc és sql / intem_strfunc.cc a részletekért.

Ennek ismerete a MySQL-csomagokról lehetővé teszi, hogy a Fejlesztő / DBA méretbe állítsa őket, hogy több BLOB-ot is befogadhassanak. egy csomag belsejében, még akkor is, ha kellemetlenül nagyok. A túl kicsi csomag mindenképpen problémákat okoz ebben a tekintetben a nyitott kapcsolatok számára.

A szerint MySQL dokumentáció

  • Ezeket a hibákat akkor is előfordulhatja, ha hibás vagy túl sok lekérdezést küld a szervernek nagy. Ha a mysqld túl nagy vagy rendezetlen csomagot kap, akkor feltételezi, hogy valami nem stimmel az ügyféllel, és lezárja a kapcsolatot. Ha nagy lekérdezésekre van szüksége (például, ha nagy BLOB oszlopokkal dolgozik), akkor növelheti a lekérdezési korlátot a kiszolgáló max_allowed_packet változójának beállításával, amelynek alapértelmezett értéke 1 MB. Lehetséges, hogy növelnie kell a maximális értéket is. csomagméret az ügyfél végén. További információ a csomagméret beállításáról a C.5.2.10. szakaszban található: „Túl nagy a csomag”.

  • Az INSERT vagy a REPLACE utasítás, amely nagyon sok sort szúr be, szintén ilyen típusú hibákat okozhat. Ezen utasítások bármelyike egyetlen kérést küld a szervernek, a beillesztendő sorok számától függetlenül. ; így gyakran elkerülheti a hibát azáltal, hogy csökkenti az INSERT vagy a REPLACE küldött sorok számát.

AJÁNLÁS

Próbálja meg emelni a max_allowed_packet sokkal nagyobb számra, mivel az alapértelmezett érték 1 millió. Az ld körülbelül 10-szereset javasol az aktuális adatkészletben lévő legnagyobb TEXT vagy BLOB mezőben.

A max_allowed_packet 256M értékre állításához adhatja hozzá az /etc/my.cnf vagy my.ini fájlokhoz

[mysqld] max_allowed_packet=256M 

a mysqld jövőbeli újraindításainak fedezésére. Az érték most a szerverre történő telepítéséhez futtassa ezt:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256; 

Próbálja ki !!!

Megjegyzések

  • Nagyon jó magyarázat.
  • @RolandoMySQLDBA Még mindig hibaüzenetet kapok az 5.7.28-as verzióban, miután kipróbáltam az összes említett megoldást. Minden tipp a további hibaelhárításhoz

Válasz

Alapértelmezés szerint a max_connections értéke 100 lesz. Próbálja meg növelni a / p>

max_connections = 400, miután a my.cnf fájlban beállította, indítsa újra a szervert, vagy állítsa be dinamikusan:

 set @@global.max_connections = 400; 

Csak próbálja meg a fenti ajánlást: kerülje ezeket a figyelmeztető üzeneteket, és ügyeljen arra is, hogy a hálózatán ne legyen csomagcsepp.

Válasz

Nemrégiben találkoztam ezzel a problémával, miután elköltöztem A MySQL Enterprise 5.1.x -ről 5.7.x -re, az alkalmazás jelentős kódváltoztatása nélkül a „ note ” megjelent.

Esetemben a “ note ” megjelenésének kiváltó oka az volt, hogy a program kilépett a még nyitott kapcsolatokkal.Az a körülmény, hogy a kapcsolatok nincsenek lezárva, kicsit jobban érintettek voltak, és nem a MySQL-hez, hanem az ACE-hez, a szálakhoz és a TSS-hez kapcsolódtak.

Válasz

Itt nem említik, ezért a probléma másik okát is felsorolom. Esetemben a mysql parancssori kliens használata közben a hibát interactive_timeout alacsony, 30 másodperces értéke okozta:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_interactive_timeout
Ez továbbra is fennmarad a munkamenetek során, de a szerver nem indul újra.

SET GLOBAL interactive_timeout=6000; 

Válasz

Ugyanazzal a problémával találkoztam a MariaDB 10.3.24-tel. Úgy tűnik, hogy a figyelmeztetés előfordulhat a fenti okok, majd néhány miatt. Esetemben az egyik adatbázis-táblázat rekordjának volt köszönhető, amelynek üres szótárértéke volt az egyik mezőnél.

+ —- + ——– + | id | config | + —- + ——– + | 3 | {} | + —- + ——– +

Tesztként a “{}” értéket “()” -re változtattam, és ezzel leállítottam az üzenetet. Csak abban az esetben, ha valakinek segít.

Válasz

Ez a my.ini sor megoldotta a problémámat:

log_error_verbosity=1 

Hivatkozás erre a linkre

Megjegyzések

  • Nem hiszem, hogy ' nem gondoltam volna, hogy megoldotta az alapvető problémát, de egyszerűen leállította a naplózást.
  • Ugyanazt az üzenetet jelentettem, mint egy " Megjegyzés ". A log_error_verbosity = 2 használata valójában megoldja a " problémát " (de egy " figyelmeztetés " címzéssel kell foglalkozni, nem szabad figyelmen kívül hagyni)

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük