A MySQL Sever has gone away nevű 2006-os hiba azt jelenti, hogy a szerver megtagadta a csatlakozást, annak ellenére, hogy fut. A hiba megjelenésének csak három ismert oka van. Az első ok az, hogy a szerver túlterhelt. A várakozási idő lejárt. A második ok - a kliens túl fájdalmas csomagot küldött. A harmadik ok, hogy a szerver nem lett teljesen inicializálva. A továbbiakban részletesen megvizsgáljuk, hogy milyen okok miatt jelenik meg a hiba, és hogyan kell kezelni.
A hiba általában akkor jelenik meg, amikor PHP, konzolos kliens, vagy PhpMyAdmin használata esetén próbálunk csatlakozni az adatbázishoz:
Vizsgáljuk tovább az egyes helyzeteket külön-külön.
Ahogy a cikk elején említettük, az egyik lehetséges ok a lejárt várakozási idő. Előfordulhat, hogy a szerver túlterhelt és nem tud megbirkózni a terheléssel - az összes kapcsolat feldolgozásával. Ahhoz, hogy megértsük, mennyi ideig tartanak a szerver kérései, használhatunk bármilyen konzolos klienst, és csatlakozhatunk a szerverhez. Ha ez sikerül, hajtson végre bármilyen kérést. Ha a lekérdezések feldolgozása túl sok időt vesz igénybe, a MySQL-t egy speciális MySQLTuner szkript segítségével optimalizálhatja. Általában az innodb_buffer_pool_size
paraméter beállításával növeljük az InnoDB motor pool méretét. Az optimális értéket a fenti szkript segítségével határozhatjuk meg.
Ha ez 800 megabájt (lehet bármilyen más méret is), állítsuk be:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Van egy másik módja is a probléma megoldásának. Ehhez a szerver válaszidejét növeljük meg. Ehhez a feladathoz meg kell változtatni a wait_timeout
paramétert. Ez az az idő másodpercben kifejezve, amely alatt a szerver válaszára kell várni.
Például:
wait_timeout=500
Módosítások elvégzésekor ne felejtse el a szerver következő újraindítását:
$ sudo systemctl restart mysql
Vagy:
$ sudo systemctl restart mariadb
Ha egy felhasználó kliense túl sok csomagot hoz létre, a kiszolgáló ezt a hibát generálja. Az elérhető csomagméret (maximális érték) a max_allowed_packet
paraméter segítségével növelhető.
Például:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Fordítson különös figyelmet az ügyfélre, mert ha sok kérést küld, akkor nyilvánvalóan valamit rosszul csinál. Legalábbis ne generáljon for
ciklusokat használó lekérdezéseket a MySQL-hez.
Ha úgy dönt, hogy a MySQL-t vagy a MariaDB-t Dockerben telepíti, készüljön fel arra, hogy hasonló hibával fog találkozni. A konténer inicializálása egy kicsit több szabadidőt igényel. Ha nem hagyja, hogy a konténer befejezze az inicializálást úgy, hogy először leállítja és elindítja, az adatbázis mindig ezt a hibát fogja visszaadni. A megoldás az, hogy a konténer adatait teljesen eltávolítjuk az adatbázisból.
Ez a következőképpen történik:
$ docker-compose down
ill:
$ docker rm mysql-container
Ezután törölni kell a tárolót (kötetet) a hibásan inicializált adatbázissal. De az elején nézze át az összes tároló listáját:
$ docker volume ls
A törlés után:
$ docker volume rm volume_name
Most már elkezdheti az alkalmazás inicializálását, csak várjon, amíg az adatbázis-kiszolgáló jelzi, hogy készen áll, és csatlakozhat hozzá.