Chyba 2006 s názvem MySQL Sever has gone away znamená, že se server odmítl připojit, přestože je spuštěn. Jsou známy pouze tři důvody, proč se tato chyba objevuje. Prvním důvodem je, že je server přetížen. Vypršela čekací doba. Druhý důvod - klient odeslal příliš bolestivý paket. Třetím důvodem je, že server nebyl plně inicializován. Dále se budeme podrobně zabývat tím, z jakých důvodů se chyba objevuje a jak ji řešit.
Chyba se obvykle objevuje při pokusu o připojení k databázi pomocí PHP, konzolového klienta nebo v případě použití PhpMyAdmin:
Prozkoumejme dále každou situaci zvlášť.
Jak bylo uvedeno na začátku tohoto článku, jednou z možných příčin je vypršení čekací doby. Může se stát, že server byl přetížen a nezvládá zátěž - zpracování všech spojení. Chcete-li pochopit, jak dlouho trvají požadavky serveru, můžete použít libovolného konzolového klienta a připojit se k serveru. Pokud se vám to podaří, proveďte libovolný požadavek. Pokud zpracování dotazů trvá příliš dlouho, můžete MySQL optimalizovat pomocí speciálního skriptu MySQLTuner. Obvykle zvětšete velikost poolu motoru InnoDB nastavením parametru innodb_buffer_pool_size
. Optimální hodnotu určíte pomocí výše uvedeného skriptu.
Pokud je to 800 megabajtů (může mít i jinou velikost), nastavte ji:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Problém lze vyřešit i jiným způsobem. Za tímto účelem se zvýší doba odezvy ze serveru. K provedení tohoto úkolu je třeba změnit parametr wait_timeout
. Jedná se o dobu v sekundách, po kterou byste měli čekat na odpověď ze serveru.
Příklad: V případě, že je server od serveru odpojen, je třeba zadat následující parametr:
wait_timeout=500
Při provádění změn nezapomeňte příště restartovat server:
$ sudo systemctl restart mysql
Nebo:
$ sudo systemctl restart mariadb
Pokud klient uživatele vytvoří příliš mnoho paketů, server vygeneruje tuto chybu. Dostupnou velikost paketu (maximální hodnotu) lze zvýšit pomocí parametru max_allowed_packet
.
Například: "V případě, že je paket uložen na serveru, je možné jej uložit na serveru.
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Věnujte zvláštní pozornost klientovi, protože pokud odesílá mnoho požadavků, zřejmě děláte něco špatně. Přinejmenším negenerujte dotazy do MySQL pomocí smyček for
.
Pokud se rozhodnete nasadit MySQL nebo MariaDB v Dockeru, připravte se na to, že se s podobnou chybou setkáte. Počáteční inicializace kontejneru vyžaduje trochu více volného času. Pokud nenecháte kontejner dokončit inicializaci tím, že jej nejprve zastavíte a spustíte, databáze vždy vrátí tuto chybu. Řešením je kompletní odstranění dat kontejneru z databáze.
To se provede následujícím způsobem:
$ docker-compose down
nebo:
$ docker rm mysql-container
Dále je třeba odstranit úložiště (svazek) s nesprávně inicializovanou databází. Na začátku však projděte seznam všech úložišť:
$ docker volume ls
Po vymazání:
$ docker volume rm volume_name
Nyní můžete začít inicializovat aplikaci, stačí počkat, až vám databázový server oznámí, že je připraven a můžete se k němu připojit.