Virhe 2006 nimeltään MySQL Sever on hävinnyt tarkoittaa, että palvelin on kieltäytynyt muodostamasta yhteyttä, vaikka se on käynnissä. Tiedetään vain kolme syytä, miksi virhe ilmestyy. Ensimmäinen syy on se, että palvelin on ylikuormittunut. Odotusaika on umpeutunut. Toinen syy - asiakas on lähettänyt liian tuskallisen paketin. Kolmas syy on se, että palvelinta ei ole täysin alustettu. Seuraavaksi tarkastelemme yksityiskohtaisesti, mistä syistä virhe ilmenee ja miten sitä käsitellään.
Yleensä virhe tulee näkyviin, kun yrität muodostaa yhteyden tietokantaan PHP:n, konsoliasiakkaan tai PhpMyAdminin käytön yhteydessä:
Tarkastellaan tarkemmin kutakin tilannetta erikseen.
Kuten tämän artikkelin alussa mainittiin, yksi mahdollisista syistä on vanhentunut odotusaika. Voi olla, että palvelin oli ylikuormitettu eikä selviydy kuormituksesta - kaikkien yhteyksien käsittelystä. Jos haluat ymmärtää, kuinka kauan palvelimen pyynnöt kestävät, voit käyttää mitä tahansa konsoliasiakasta ja muodostaa yhteyden palvelimeen. Jos pystyt siihen, suorita mikä tahansa pyyntö. Jos kyselyjen käsittely kestää liian kauan, voit optimoida MySQL:ää käyttämällä erityistä skriptiä MySQLTuner. Lisää yleensä InnoDB-moottorin poolin kokoa asettamalla parametri innodb_buffer_pool_size
. Optimaalinen arvo määritetään edellä mainitun skriptin avulla.
Jos se on 800 megatavua (se voi olla mikä tahansa muu koko), aseta se:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
On toinenkin tapa ratkaista ongelma. Tätä varten palvelimen vasteaikaa kasvatetaan. Tätä tehtävää varten on muutettava wait_timeout-parametria
. Tämä on sekunteina ilmaistu aika, jonka aikana palvelimelta on odotettava vastausta.
Esim:
wait_timeout=500
Kun teet muutoksia, älä unohda käynnistää palvelinta seuraavaksi uudelleen:
$ sudo systemctl restart mysql
Tai:
$ sudo systemctl restart mariadb
Kun käyttäjän asiakasohjelma luo liian suuria paketteja, palvelin tuottaa tämän virheen. Käytettävissä olevaa pakettikokoa (enimmäisarvo) voidaan kasvattaa parametrilla max_allowed_packet
.
Esim:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Kiinnitä erityistä huomiota asiakkaaseen, sillä jos se lähettää paljon pyyntöjä, teet ilmeisesti jotain väärin. Älä ainakaan luo kyselyjä MySQL:lle for-silmukoita
käyttäen.
Jos päätät ottaa MySQL:n tai MariaDB:n käyttöön Dockerissa, varaudu kohtaamaan samanlainen virhe. Kontin alustaminen vaatii hieman enemmän vapaa-aikaa. Jos et anna kontin suorittaa alustusta loppuun pysäyttämällä ja käynnistämällä sitä ensin, tietokanta palauttaa aina tämän virheen. Ratkaisu on poistaa kontin tiedot kokonaan tietokannasta.
Tämä tehdään näin:
$ docker-compose down
tai:
$ docker rm mysql-container
Seuraavaksi on poistettava tallennustila (volume), jossa on virheellisesti alustettu tietokanta. Mutta katso aluksi läpi kaikkien tallennustilojen luettelo:
$ docker volume ls
Poistamisen jälkeen:
$ docker volume rm volume_name
Nyt voit aloittaa sovelluksen alustamisen, odota vain, kunnes tietokantapalvelin ilmoittaa, että se on valmis ja voit muodostaa siihen yhteyden.