2006 m. klaida "MySQL Sever" dingo reiškia, kad serveris atsisakė prisijungti, nors jis veikia. Žinomos tik trys priežastys, dėl kurių ši klaida atsiranda. Pirmoji priežastis yra ta, kad serveris yra perkrautas. Pasibaigė laukimo laikas. Antroji priežastis - klientas išsiuntė per daug skausmingą paketą. Trečioji priežastis - serveris nebuvo visiškai inicializuotas. Toliau išsamiai aptarsime, dėl kokių priežasčių atsiranda klaida ir kaip su ja kovoti.
Paprastai klaida atsiranda bandant prisijungti prie duomenų bazės naudojant PHP, konsolinį klientą arba naudojant "PhpMyAdmin":
Toliau panagrinėkime kiekvieną situaciją atskirai.
Kaip minėta šio straipsnio pradžioje, viena iš galimų priežasčių yra pasibaigęs laukimo laikas. Gali būti, kad serveris buvo perkrautas ir negali susidoroti su apkrova - apdoroti visų prisijungimų. Norėdami suprasti, kiek laiko užtrunka serverio užklausos, galite naudoti bet kurį konsolės klientą ir prisijungti prie serverio. Jei galite tai padaryti, įvykdykite bet kurią užklausą. Jei užklausų apdorojimas trunka per ilgai, galite optimizuoti "MySQL" naudodami specialų scenarijų "MySQLTuner". Paprastai padidinkite "InnoDB" variklio fondo dydį nustatydami parametrą innodb_buffer_pool_size
. Optimali vertė nustatoma naudojant pirmiau minėtą scenarijų.
Jei ji yra 800 megabaitų (gali būti bet kokio kito dydžio), nustatykite ją:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Yra ir kitas problemos sprendimo būdas. Šiuo tikslu padidinamas serverio atsako laikas. Norėdami atlikti šią užduotį, turite pakeisti parametrą wait_timeout
. Tai laikas sekundėmis, per kurį turėtumėte laukti atsakymo iš serverio.
Pavyzdžiui:
wait_timeout=500
Atlikdami pakeitimus, nepamirškite paskui iš naujo paleisti serverį:
$ sudo systemctl restart mysql
Arba:
$ sudo systemctl restart mariadb
Kai naudotojo klientas sukuria per daug paketų, serveris generuoja šią klaidą. Galimą paketų dydį (didžiausią reikšmę) galima padidinti naudojant parametrą max_allowed_packet
.
Pavyzdžiui:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Atkreipkite ypatingą dėmesį į klientą, nes jei jis siunčia daug užklausų, akivaizdu, kad kažką darote ne taip. Bent jau negeneruokite užklausų "MySQL" naudodami for
ciklus.
Jei nuspręsite "MySQL" arba MariaDB įdiegti "Docker" sistemoje, būkite pasirengę susidurti su panašia klaida. Pradiniam konteinerio inicializavimui reikia šiek tiek daugiau laisvo laiko. Jei neleisite konteineriui užbaigti inicializacijos, prieš tai jį sustabdydami ir paleisdami, duomenų bazė visada grąžins šią klaidą. Sprendimas - visiškai pašalinti konteinerio duomenis iš duomenų bazės.
Tai daroma taip:
$ docker-compose down
arba:
$ docker rm mysql-container
Toliau reikia ištrinti saugyklą (tomą) su neteisingai inicializuota duomenų baze. Tačiau pradžioje peržiūrėkite visų saugyklų sąrašą:
$ docker volume ls
Ištrynus:
$ docker volume rm volume_name
Dabar galite pradėti inicializuoti programą, tik palaukite, kol duomenų bazės serveris praneš, kad yra paruoštas, ir galėsite prie jo prisijungti.