Грешка 2006, наречена MySQL Sever has gone away, означава, че сървърът е отказал да се свърже, въпреки че работи. Известни са само три причини за появата на тази грешка. Първата причина е, че сървърът е претоварен. Времето за изчакване е изтекло. Втората причина - клиентът е изпратил пакет, който е твърде болезнен. Третата причина е, че сървърът не е напълно инициализиран. По-нататък ще разгледаме подробно какви са причините за появата на грешката и как да се справим с нея.
Обикновено грешката се появява, когато се опитвате да се свържете с базата данни с помощта на PHP, конзолен клиент или в случай на използване на PhpMyAdmin:
Нека разгледаме всяка ситуация поотделно.
Както беше споменато в началото на тази статия, една от възможните причини е изтеклото време за изчакване. Възможно е сървърът да е бил претоварен и да не може да се справи с натоварването - да обработи всички връзки. За да разберете колко време отнемат заявките на сървъра, можете да използвате всеки конзолен клиент и да се свържете със сървъра. Ако сте в състояние да го направите, изпълнете някоя заявка. Ако обработката на заявките отнема твърде много време, можете да оптимизирате MySQL с помощта на специален скрипт MySQLTuner. Обикновено увеличете размера на пула на двигателя InnoDB, като зададете параметъра innodb_buffer_pool_size
. Оптималната стойност се определя с помощта на горния скрипт.
Ако тя е 800 мегабайта (може да бъде и друг размер), задайте я:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Съществува и друг начин за решаване на проблема. За тази цел се увеличава времето за отговор от сървъра. За да изпълните тази задача, трябва да промените параметъра wait_timeout
. Това е времето в секунди, през което трябва да изчакате отговор от сървъра.
Например:
wait_timeout=500
Когато правите промени, не забравяйте да рестартирате сървъра след това:
$ sudo systemctl restart mysql
Или:
$ sudo systemctl restart mariadb
Когато клиентът на даден потребител създаде твърде много пакети, сървърът ще генерира тази грешка. Наличният размер на пакета (максимална стойност) може да бъде увеличен с помощта на параметъра max_allowed_packet
.
Например:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Обърнете специално внимание на клиента, защото ако той изпраща много заявки, очевидно правите нещо нередно. Най-малкото не генерирайте заявки към MySQL, като използвате цикли for
.
Ако решите да разгърнете MySQL или MariaDB в Docker, бъдете готови да се сблъскате с подобна грешка. Първоначалното инициализиране на контейнера изисква малко повече свободно време. Ако не оставите контейнера да завърши инициализацията, като първо го спрете и стартирате, базата данни винаги ще връща тази грешка. Решението е да премахнете напълно данните на контейнера от базата данни.
Това се прави по следния начин:
$ docker-compose down
или:
$ docker rm mysql-container
След това трябва да изтриете паметта (тома) с неправилно инициализираната база данни. Но в началото прегледайте списъка с всички хранилища:
$ docker volume ls
След изтриването:
$ docker volume rm volume_name
Сега можете да започнете да инициализирате приложението, просто изчакайте, докато сървърът на базата данни ви каже, че е готов и можете да се свържете с него.