Viga 2006 nimega MySQL Sever on kadunud tähendab, et server on keeldunud ühendust võtmast, kuigi see töötab. On ainult kolm teadaolevat põhjust, miks see viga ilmub. Esimene põhjus on see, et server on ülekoormatud. Ooteaeg on lõppenud. Teine põhjus - klient on saatnud liiga valusa paketi. Kolmas põhjus on see, et server ei ole täielikult initsialiseeritud. Edasi vaatleme üksikasjalikult, mis põhjustel viga ilmneb ja kuidas sellega toime tulla.
Tavaliselt ilmneb viga siis, kui üritatakse andmebaasiga ühendust luua PHP, konsoolikliendi või PhpMyAdmin'i kasutamise korral:
Uurime edaspidi iga olukorda eraldi.
Nagu artikli alguses mainitud, on üks võimalikest põhjustest aegunud ooteaeg. Võib olla, et server oli ülekoormatud ja ei saa koormusega hakkama - kõigi ühenduste töötlemine. Selleks, et mõista, kui kaua serveripäringud kestavad, võite kasutada mis tahes konsooliklienti ja luua serveriga ühenduse. Kui teil on võimalik seda teha, täitke mis tahes päring. Kui päringute töötlemine võtab liiga palju aega, saate MySQL-i optimeerida spetsiaalse skripti MySQLTuner abil. Tavaliselt suurendage InnoDB mootori reservi suurust, seades parameetri innodb_buffer_pool_size
. Optimaalne väärtus määratakse ülaltoodud skripti abil.
Kui see on 800 megabaiti (see võib olla ka mõni muu suurus), siis seadke see:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Probleemi lahendamiseks on veel üks võimalus. Selleks suurendatakse serveri reageerimisaega. Selle ülesande täitmiseks tuleb muuta parameetrit wait_timeout
. See on aeg sekundites, mille jooksul peaksite ootama serverilt vastust.
Näiteks:
wait_timeout=500
Muudatuste tegemisel ärge unustage järgmisena serveri taaskäivitamist:
$ sudo systemctl restart mysql
Või:
$ sudo systemctl restart mariadb
Kui kasutaja klient loob liiga palju pakette, genereerib server selle vea. Lubatud paketi suurust (maksimaalset väärtust) saab suurendada, kasutades parameetrit max_allowed_packet
.
Näiteks:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Pöörake kliendile erilist tähelepanu, sest kui ta saadab palju päringuid, siis teete ilmselgelt midagi valesti. Vähemalt ärge genereerige päringuid MySQL-ile, kasutades for-silmuseid
.
Kui otsustate MySQL-i või MariaDB-d Dockeris kasutusele võtta, olge valmis sarnase veaga kokku puutuma. Konteineri initsialiseerimine nõuab veidi rohkem vaba aega. Kui te ei lase konteineril lõpule viia initsialiseerimist, peatades ja käivitades selle kõigepealt, annab andmebaas alati selle vea tagasi. Lahendus on konteineri andmete täielik eemaldamine andmebaasist.
Seda tehakse järgmiselt:
$ docker-compose down
või:
$ docker rm mysql-container
Seejärel tuleb kustutada salvestusruum (volume), kus on valesti initsialiseeritud andmebaas. Aga alguses vaadake läbi kõigi salvestiste nimekiri:
$ docker volume ls
Pärast kustutamist:
$ docker volume rm volume_name
Nüüd võite alustada rakenduse initsialiseerimist, lihtsalt oodake, kuni andmebaasiserver ütleb teile, et ta on valmis ja te saate temaga ühendust võtta.