Начини на плащане Abuse

Ошибка 2006: MySQL сървърът си отиде

09.03.2021, 22:01

Грешка 2006, наречена MySQL Sever has gone away, означава, че сървърът е отказал да се свърже, въпреки че работи. Известни са само три причини за появата на тази грешка. Първата причина е, че сървърът е претоварен. Времето за изчакване е изтекло. Втората причина - клиентът е изпратил пакет, който е твърде болезнен. Третата причина е, че сървърът не е напълно инициализиран. По-нататък ще разгледаме подробно какви са причините за появата на грешката и как да се справим с нея.

Как да отстраним грешката

Обикновено грешката се появява, когато се опитвате да се свържете с базата данни с помощта на PHP, конзолен клиент или в случай на използване на PhpMyAdmin:

PhpMyAdmin

Нека разгледаме всяка ситуация поотделно.

Изтекъл таймаут

Както беше споменато в началото на тази статия, една от възможните причини е изтеклото време за изчакване. Възможно е сървърът да е бил претоварен и да не може да се справи с натоварването - да обработи всички връзки. За да разберете колко време отнемат заявките на сървъра, можете да използвате всеки конзолен клиент и да се свържете със сървъра. Ако сте в състояние да го направите, изпълнете някоя заявка. Ако обработката на заявките отнема твърде много време, можете да оптимизирате MySQL с помощта на специален скрипт MySQLTuner. Обикновено увеличете размера на пула на двигателя InnoDB, като зададете параметъра innodb_buffer_pool_size. Оптималната стойност се определя с помощта на горния скрипт.

Ако тя е 800 мегабайта (може да бъде и друг размер), задайте я:

$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M

https://pq.hosting/help/myfiles/mysqlhasgoneavay-991x576.png

Съществува и друг начин за решаване на проблема. За тази цел се увеличава времето за отговор от сървъра. За да изпълните тази задача, трябва да промените параметъра wait_timeout. Това е времето в секунди, през което трябва да изчакате отговор от сървъра.

Например:

wait_timeout=500

параметр wait_timeout

Когато правите промени, не забравяйте да рестартирате сървъра след това:

$ 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

Сега можете да започнете да инициализирате приложението, просто изчакайте, докато сървърът на базата данни ви каже, че е готов и можете да се свържете с него.