Chyba 2006 s názvom MySQL Sever odišla znamená, že sa server odmietol pripojiť, hoci je spustený. Sú známe len tri dôvody, prečo sa táto chyba objavuje. Prvým dôvodom je, že server je preťažený. Vypršal čas čakania. Druhý dôvod - klient odoslal príliš bolestivý paket. Tretím dôvodom je, že server nebol úplne inicializovaný. Ďalej sa budeme podrobne zaoberať tým, z akých dôvodov sa chyba objavuje a ako ju riešiť.
Chyba sa zvyčajne objavuje pri pokuse o pripojenie k databáze pomocou jazyka PHP, konzolového klienta alebo v prípade použitia programu PhpMyAdmin:
Poďme ďalej preskúmať každú situáciu zvlášť.
Ako bolo spomenuté na začiatku tohto článku, jednou z možných príčin je uplynutý čakací čas. Môže sa stať, že server bol preťažený a nezvláda záťaž - spracovanie všetkých spojení. Ak chcete pochopiť, ako dlho trvajú požiadavky servera, môžete použiť ľubovoľného konzolového klienta a pripojiť sa k serveru. Ak sa vám to podarí, vykonajte ľubovoľnú požiadavku. Ak spracovanie požiadaviek trvá príliš dlho, môžete optimalizovať MySQL pomocou špeciálneho skriptu MySQLTuner. Zvyčajne zvýšte veľkosť poolu motora InnoDB nastavením parametra innodb_buffer_pool_size
. Optimálnu hodnotu určíte pomocou uvedeného skriptu.
Ak je to 800 megabajtov (môže to byť akákoľvek iná veľkosť), nastavte ju:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Existuje aj iný spôsob riešenia problému. Na tento účel sa zvýši čas odozvy zo servera. Na vykonanie tejto úlohy je potrebné zmeniť parameter wait_timeout
. Ide o čas v sekundách, počas ktorého by ste mali čakať na odpoveď zo servera.
Napríklad:
wait_timeout=500
Pri vykonávaní zmien nezabudnite na ďalší reštart servera:
$ sudo systemctl restart mysql
Alebo:
$ sudo systemctl restart mariadb
Keď klient používateľa vytvorí príliš veľa paketov, server vygeneruje túto chybu. Dostupnú veľkosť paketu (maximálnu hodnotu) možno zvýšiť pomocou parametra max_allowed_packet
.
Napríklad:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Venujte osobitnú pozornosť klientovi, pretože ak posiela veľa požiadaviek, zrejme robíte niečo zle. Prinajmenšom negenerujte dopyty do MySQL pomocou for
cyklov.
Ak sa rozhodnete nasadiť MySQL alebo MariaDB v aplikácii Docker, pripravte sa na to, že sa s podobnou chybou môžete stretnúť. Počiatočná inicializácia kontajnera si vyžaduje trochu viac voľného času. Ak nenecháte kontajner dokončiť inicializáciu tak, že ho najprv zastavíte a spustíte, databáza vždy vráti túto chybu. Riešením je úplné odstránenie údajov kontajnera z databázy.
To sa vykoná takto:
$ docker-compose down
alebo:
$ docker rm mysql-container
Ďalej je potrebné odstrániť úložisko (zväzok) s nesprávne inicializovanou databázou. Na začiatku si však prezrite zoznam všetkých úložísk:
$ docker volume ls
Po vymazaní:
$ docker volume rm volume_name
Teraz môžete začať inicializovať aplikáciu, stačí počkať, kým vám databázový server oznámi, že je pripravený a môžete sa k nemu pripojiť.