Fejl 2006 kaldet MySQL Sever has gone away betyder, at serveren har nægtet at oprette forbindelse, selv om den kører. Der er kun tre kendte årsager til, at fejlen vises. Den første grund er, at serveren er overbelastet. Ventetiden er udløbet. Den anden grund er, at klienten har sendt en pakke, der er for smertefuld. Den tredje grund er, at serveren ikke er blevet fuldt initialiseret. I det følgende vil vi se nærmere på, hvorfor fejlen opstår, og hvordan man håndterer den.
Fejlen opstår normalt, når man forsøger at oprette forbindelse til databasen ved hjælp af PHP, konsolklient eller i tilfælde af brug af PhpMyAdmin:
Lad os undersøge hver situation for sig.
Som nævnt i begyndelsen af denne artikel er en af de mulige årsager udløbet ventetid. Det kan være, at serveren var overbelastet og ikke kan klare belastningen - behandle alle forbindelser. For at forstå, hvor lang tid serveranmodninger tager, kan du bruge en hvilken som helst konsolklient og oprette forbindelse til serveren. Hvis du er i stand til det, kan du udføre en hvilken som helst anmodning. Hvis forespørgsler tager for lang tid at behandle, kan du optimere MySQL ved hjælp af et særligt script, MySQLTuner. Øg normalt InnoDB-motorens poolstørrelse ved at indstille parameteren innodb_buffer_pool_size
. Den optimale værdi bestemmes ved hjælp af ovenstående script.
Hvis den er 800 megabyte (den kan være en hvilken som helst anden størrelse), skal du indstille den:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Der er en anden måde at løse problemet på. Til dette formål øges svartiden fra serveren. For at udføre denne opgave skal du ændre parameteren wait_timeout
. Det er den tid i sekunder, hvor du skal vente på svar fra serveren.
Et eksempel:
wait_timeout=500
Glem ikke at genstarte serveren, når du foretager ændringer:
$ sudo systemctl restart mysql
Eller:
$ sudo systemctl restart mariadb
Når en brugers klient opretter for mange pakker, vil serveren generere denne fejl. Den tilgængelige pakkestørrelse (maksimumværdi) kan øges ved hjælp af parameteren max_allowed_packet
.
Et eksempel:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Vær særlig opmærksom på klienten, for hvis den sender mange forespørgsler, gør du tydeligvis noget forkert. Generér i det mindste ikke forespørgsler til MySQL ved hjælp af for-løkker
.
Hvis du beslutter dig for at implementere MySQL eller MariaDB i Docker, skal du være forberedt på at støde på en lignende fejl. Den indledende initialisering af containeren kræver lidt mere fritid. Hvis du ikke lader containeren fuldføre initialiseringen ved at stoppe og starte den først, vil databasen altid returnere denne fejl. Løsningen er at fjerne containerens data helt fra databasen.
Det gøres på denne måde:
$ docker-compose down
eller:
$ docker rm mysql-container
Dernæst skal du slette lageret (volumen) med den forkert initialiserede database. Men kig først listen over alle lagre igennem:
$ docker volume ls
Efter sletning:
$ docker volume rm volume_name
Nu kan du begynde at initialisere applikationen, bare vent, indtil databaseserveren fortæller dig, at den er klar, og du kan oprette forbindelse til den.