MySQL is de tweede beroemde database ter wereld volgens de DB Engine-website achter Oracle. Wat MySQL beroemd maakt, is waarschijnlijk omdat het een zeer snel, betrouwbaar en flexibel databasebeheersysteem is. MySQL is ook een van de ondersteunde databases in ClusterControl. Met ClusterControl kunt u eenvoudig implementeren, schalen, controleren en een heleboel dingen doen.
Vandaag gaan we het hier niet over hebben, maar we bespreken een van de veelvoorkomende fouten voor MySQL en mogelijke tips voor het oplossen van problemen. Bij het werken met tickets, vaak wanneer we de foutrapporten of logboeken controleren, zagen we deze regel 'Er is een fout opgetreden bij het lezen van het communicatiepakket' vrij vaak. We denken dat het nuttig zou zijn als we een blog schrijven over deze fout, niet alleen voor onze klanten, maar ook voor andere lezers. Laten we niet langer wachten, het is tijd om meer te duiken!
MySQL Client/Server Protocol
Allereerst moeten we begrijpen hoe MySQL communiceert tussen client en server. Zowel de client als de server gebruiken het MySQL-protocol dat wordt geïmplementeerd door Connectors, MySQL Proxy en ook de communicatie tussen master- en slave-replicatieservers. Het MySQL-protocol ondersteunt functies zoals transparante codering via SSL, transparante compressie, een verbindingsfase en ook een opdrachtfase.
Zowel gehele getallen als tekenreeksen zijn de basisgegevenstypen die in het MySQL-protocol worden gebruikt. Telkens wanneer de MySQL-client en -server met elkaar willen communiceren of de gegevens willen verzenden, verdeelt het de gegevens in pakketten met een maximale grootte van 16 MB en voegt het ook een pakketheader toe aan elk stuk. In elk pakket zit een lading waarin de gegevenstypen (gehele getallen/tekenreeksen) hun rol spelen.
Aangezien CLIENT_PROTOCOL_41 is ingeschakeld, zal de server voor bijna elke opdracht die de client naar de server stuurt, een van de volgende pakketten als antwoord beantwoorden:
OK_Packet
Dit is het signaal voor elk succesvol commando.
ERR_Packet
Het signaal geeft een fout aan voor het pakket.
EOF_Packet
Dit pakket bevat een waarschuwings- of statusvlag.
Hoe de problemen te diagnosticeren
Normaal gesproken zijn er twee soorten verbindingsproblemen, namelijk communicatiefouten of afgebroken verbindingen. Wanneer een van deze verbindingsproblemen optreedt, zijn de volgende informatiebronnen het goede startpunt voor het oplossen van problemen en analyse:
-
Het foutenlogboek
-
Het algemene querylogboek
-
De statusvariabelen Aborted_xxx en Connection_errors_xxx
-
De hostcache
Verbindingsfouten en mogelijke redenen
In het geval er verbindingsfouten optreden en afhankelijk van de fouten, wordt de statusteller verhoogd voor Aborted_clients of Aborted_connects in de statusvariabelen. Zoals overgenomen uit de MySQL-documentatie, betekent Aborted_clients het aantal verbindingen dat is afgebroken omdat de client is overleden zonder de verbinding goed te sluiten. Wat betreft Aborted_connects, dit betekent het aantal mislukte pogingen om verbinding te maken met de MySQL-server.
Als u de MySQL-server start met de optie --log-warnings, is de kans groot dat u het voorbeeld van het volgende bericht in uw foutenlogboek ziet. Zoals je hebt opgemerkt, zei het bericht duidelijk dat het betrekking heeft op de verbinding afbreken, vandaar dat de statusteller Aborted_connects wordt verhoogd in de statusvariabele:
[Waarschuwing] Verbroken verbinding 154669 met db:'wordpress' gebruiker:'wpuser' host:'hostname' (Fout bij lezen van communicatiepakketten)
Normaal gesproken kunnen er om de volgende redenen mislukte verbindingspogingen plaatsvinden. Wanneer u dit heeft opgemerkt, geeft dit mogelijk aan dat een onbevoegd persoon op het punt staat de database te schenden en dat u dit zo snel mogelijk wilt bekijken:
-
Een klant heeft geen toegangsrechten tot de database.
-
Er is een verkeerde referentie gebruikt.
-
Een verbindingspakket met onjuiste informatie.
-
Vanwege de limiet die is bereikt voor connect_timeout om verbinding te maken.
De statusvariabele voor Aborted_clients wordt door de server verhoogd als een client erin slaagt verbinding te maken, maar de verbinding wordt verbroken of op een onjuiste manier wordt beëindigd. Daarnaast logt de server ook een bericht over een afgebroken verbinding in het foutenlogboek. Voor dit type fout kan dit meestal de volgende reden hebben:
-
De client sluit de verbinding niet goed voordat deze wordt afgesloten (roept mysql_close () niet aan).
-
De client heeft de wait_timeout of interactive_timeout seconden overschreden.
-
Het clientprogramma of de applicatie eindigde plotseling midden in de gegevensoverdracht.
Naast de eerdere redenen, kunnen andere waarschijnlijke redenen voor zowel afgebroken verbindingen als problemen met afgebroken clients te maken hebben met een van de volgende zaken:
-
TCP/IP-configuratie in de war.
-
De variabelewaarde is te klein voor max_allowed_packet.
-
Onvoldoende geheugentoewijzing voor query's.
-
Defecte hardware zoals ethernets, switches, kabels, enz.
-
Problemen met de threadbibliotheek.
-
Duplexsyndroomprobleem waarbij de overdracht in burst-pause-burst-pause-modus gaat (als u het ethernetprotocol gebruikt met Linux, zowel half- als full-duplex).
MySQL-communicatiefouten oplossen
Nu we veel mogelijkheden hebben geleerd die MySQL-verbindingsfouten veroorzaakten. Op basis van onze ervaring is dit probleem meestal gerelateerd aan de firewall of netwerkproblemen. Het is ook eerlijk om te zeggen dat het niet eenvoudig is om dit soort problemen te diagnosticeren. Desalniettemin kan de volgende oplossing u helpen bij het oplossen van deze fout:
-
Als uw toepassing afhankelijk is van de wait_timeout om de verbinding te sluiten, is het de moeite waard om de toepassingslogica te wijzigen zodat deze goed gesloten aan het einde van elke operatie.
-
Zorg ervoor dat de waarde voor max_allowed_packet binnen het acceptabele bereik ligt, zodat de client geen fout ontvangt met betrekking tot het "pakket te groot".
-
Voor problemen met verbindingsvertragingen die te wijten kunnen zijn aan de DNS, is het de moeite waard om te controleren of u skip-name- oplossen ingeschakeld.
-
Als u een PHP-toepassing of een ander programma gebruikt, kunt u het beste ervoor zorgen dat deze niet wordt afgebroken de verbindingen die doorgaans zijn ingesteld op max_execution_time.
-
Als je veel TIME_WAIT-meldingen van netstat hebt opgemerkt, is het de moeite waard om te bevestigen dat de verbindingen goed worden beheerd op de applicatie einde.
-
Als u Linux gebruikt en vermoedt dat het probleem te wijten is aan het netwerk, kunt u het beste de netwerkinterface controleren door de opdracht ifconfig-a te gebruiken en de uitvoer op de MySQL-server te onderzoeken op fouten.
-
Voor ClusterControl-gebruikers kunt u Auditlogboek inschakelen via Cluster -> Beveiliging -> Auditlogboek. Door deze functie in te schakelen, kan het u helpen om te bepalen welke zoekopdracht de boosdoener is.
-
Netwerktools zoals tcpdump en Wireshark kunnen nuttig zijn bij het identificeren van potentiële netwerkproblemen, time-outs en bronproblemen voor MySQL.
-
Controleer regelmatig de hardware door ervoor te zorgen dat er geen defecte apparaten zijn, vooral voor ethernets, hubs, switches, kabels enz. Het is de moeite waard om het defecte apparaat te vervangen om er zeker van te zijn dat de verbinding altijd goed is.
Conclusie
Er zijn veel redenen die kunnen leiden tot problemen met het MySQL-verbindingspakket. Wanneer dit probleem zich voordoet, heeft dit zeker invloed op het bedrijf en de dagelijkse bedrijfsvoering. Hoewel dit type probleem niet gemakkelijk te diagnosticeren is en meestal te wijten is aan het netwerk of de firewall, is het de moeite waard om alle eerder voorgestelde stappen in overweging te nemen om het probleem op te lossen. We hopen echt dat deze blogpost je op de een of andere manier kan helpen, vooral als je met dit probleem wordt geconfronteerd.