Содержание
- Ошибка 2006: MySQL server has gone away
- Как исправить MySQL server has gone away
- 1. Истекло время ожидания
- 2. Слишком большой пакет
- 3. Сервер неверно проинициализирован
- Выводы
- Частые вопросы
- Ошибки базы данных
- MySQL Server Has Gone Away — как пофиксить
- Таймаут соединения
- Большой или некорректный пакет
- Самое главное
Ошибка 2006: MySQL server has gone away
Эта ошибка означает, что MySQL сервер запущен, но он отказывает вам в соединении. Это может произойти по нескольким причинам. Самых основных и часто встречающихся причин три: сервер перегружен, и у вас истекло время ожидания ответа, ваш клиент отправил слишком большой пакет или сервер был не до конца проинициализирован.
В этой небольшой статье мы рассмотрим более подробно, почему возникает ошибка 2006: MySQL server has gone away, а также — как её исправить.
Как исправить MySQL server has gone away
Такую ошибку вы можете увидеть во время подключения к базе данных с помощью PHP, консольного клиента или, например, в PhpMyAdmin:
1. Истекло время ожидания
Как я уже писал выше, одной из причин может быть таймаут ожидания соединения. Возможно, сервер баз данных перегружен и не успевает обрабатывать все соединения. Вы можете подключиться к серверу с помощью консольного клиента, если вам это удастся, и попытаться выполнить какой-либо запрос, чтобы понять, действительно ли запросы выполняются слишком долго. Если это так, можно оптимизировать производительность MySQL с помощью скрипта MySQLTuner.
В большинстве случаев надо увеличить размер пула движка InnoDB с помощью параметра innodb_buffer_pool_size. Какое значение лучше поставить, можно узнать с помощью указанного выше скрипта. Например, 800 мегабайт:
sudo vi /etc/mysql/my.cnf
Есть и другой путь решения этой проблемы. Если такая скорость обработки запросов считается нормальной, можно увеличить время ожидания ответа от сервера. Для этого измените значение параметра wait_timeout. Это время в секундах, на протяжении которого надо ждать ответа от сервера. Например:
После любых изменений не забудьте перезапустить MySQL сервер:
sudo systemctl restart mysql
sudo systemctl restart mariadb
2. Слишком большой пакет
Если ваш клиент MySQL создаёт слишком большие пакеты с запросами к серверу, это тоже может стать причиной такой ошибки. Максимально доступный размер пакета можно увеличить с помощью параметра max_allowed_packet. Например:
sudo vi /etc/mysql/my.cnf
Обратите внимание, что если вы из своей программы отправляете большие пакеты, то, скорее всего, вы делаете что-то не так. Не надо генерировать запросы к MySQL с помощью циклов for. SQL — это отдельный язык программирования, который многое может сделать сам, без необходимости писать очень длинные запросы.
3. Сервер неверно проинициализирован
Такая проблема может возникать при разворачивании контейнера MySQL или MariaDB в Docker. Дело в том, что на первоначальную инициализацию контейнера нужно много времени: около нескольких минут. Если вы не дадите контейнеру завершить инициализацию, а остановите его и потом снова запустите, то база данных будет всегда возвращать такую ошибку.
Вам нужно полностью удалить данные контейнера с базой данных. Например, с помощью docker-compose:
docker rm mysql-container
Здесь mysql-container — это имя контейнера с базой данных. А затем надо удалить хранилище (volume) с некорректно проинициализированной базой. Сначала посмотрите список всех хранилищ:
docker volume ls
Затем удалите нужное:
docker volume rm имя_хранилища
После этого можете снова запускать инициализацию приложения, только на этот раз дождитесь, пока сервер баз данных сообщит, что он готов, и вы сможете к нему подключиться.
Выводы
В этой небольшой статье мы рассмотрели, что значит ошибка MySQL Server has gone away, а также как её исправить на сервере или в контейнере Docker. Вы знаете ещё другие причины и решения этой проблемы? Пишите в комментариях!
Источник
Частые вопросы
Ошибки базы данных
| MySQL server has gone away или Lost connection to server during query |
| В процессе выполнения запроса сервер оборвал соединение. Проблема связана с настройкой MySQL и часто возникает когда на сервере установлен небольшой лимит времени на соединение.
Установите в bitrix/php_interface/after_connect.php: $DB->Query(«SET wait_timeout=28800»); Если проблема останется — обратитесь к администратору хостинга. Наверх |
| Не отвечает сервер при сохранении данных формы под MSSQL |
| Проблема часто возникает из за низкого значения параметра PHP odbc.defaultlrl, по умолчанию равного 4096.
Вам необходимо существенно увеличить его, например, до 64000. Наверх |
| При переносе на другой хостинг: «#1064 — You have an error in your SQL syntax. ‘DEFAULT CHARSET=. « |
| Проблема возникает в связи с тем, что дамп БД создается в MySQL версии 4.1 или выше, а устанавливается на более ранней версии MySQL, которая не поддерживает объявление кодировки для таблицы.
Для решения проблемы воспользуйтесь опцией mysqldump: —compatible=mysql40 Наверх |
| При установке на Oracle выдает следующую ошибку: ORA-01704: string literal too long |
| Скорее всего, Вы устанавливаете систему при установленной кодировке UTF8 в Oracle.
Установите значение параметра NLS_LANG, например, в AMERICAN_AMERICA.CL8MSWIN1251 Значение параметра Вы можете прописать в реесте Windows, в ветке HLM/SOFTWARE/ORACLE Наверх |
| Неправильно сортируются элементы в списках |
| Возможны разные варианта проблемы:
Обратитесь за решением данной проблемы к администратору хостинга. 2. Проверьте значения, отвечающие за кодировку БД: character_set, или, для версий MySQL 4.1 и выше, character_set_server и character_set_database. При использовании кодировки, отличной от cp1251 (кириллица), например, latin1, сортировка по строкам, содержащим символы кириллицы, будет производиться некорректно. Проверить это можно выполнив запрос к БД show variables like ‘char%’; Для решения проблемы установить в файле /bitrix/php_interface/after_connect следующие строки $DB->Query(«SET NAMES cp1251»); Если указанные действия не помогают, то выполните перенос системы (установку) еще раз, создавая дамп БД в кодировке cp1251 и создав новую БД тоже в кодировке cp1251. Наверх |
| Server shutdown in progress |
| Часто такая ошибка возникает, когда на сервере установлено ограничение на ресурсы, отводимое операционной системой на тот или иной процесс. Вам нужно обратиться к системному администратору хостинга с тем, чтобы он дал ответ — по какой причине процесс mysql-сервера перезапускается.
Наверх |
| Out of range value adjusted for column ‘USER_ID’ или Incorrect integer value: » for column ‘SESS_SESSION_ID’ |
| Скорее всего, у вас установлен MySQL версии 5.x
Вам необходимо из значения для переменной sql-mode убрать STRICT_TRANS_TABLES. 1 вариант: изменение конфигурации сервера через my.cnf. Например, sql-mode=»NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION» sql-mode=»STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION» 2 вариант: если у Вас нет доступа к конфигурационным файлам MySQL-сервера, попробуйте в /bitrix/php_interface/after_connect.php добавить строку: $DB->Query(«set sql_mode=»») Подробнее на официальном сайте: Наверх |
| Access denied for user: ‘ user @%’ to database ‘dab_test’ |
| Начиная с 4-ой версии MySQL права на LOCK назначаются отдельно.
Необходимо дополнительно назначить права на LOCK TABLES для данного пользователя базы данных. Наверх |
| DB query error. Please try later |
| Для решения проблемы в файле /bitrix/php_interface/dbconn.php установите значение переменной $DBDebug в значение true.
После этого обновите страницу: на экране появится текст ошибки. Передайте его в службу нашу поддержки. Наверх |
| Out of memory; restart server and try again (needed XXXXX bytes) |
| Эта ошибка говорит о том, что MySQL-серверу не хватает памяти на выборку данных. Достаточно часто такая проблема решается перезагрузкой веб-сервера и MySQL.
Также рекомендуем вам установить следующие значения для MySQL в файле my.cnf: key_buffer = 64M Если какие-то из рекомендуемых значений меньше установленных сейчас, оставьте эти значения прежними. Наверх |
| Got error 28 from table handler |
| Это сообщение об ошибке означает, что не осталось свободного дискового пространства для работы MySQL.
Обратитесь к системному администратору Вашего сервера для решения проблемы. Наверх |
| Ошибки БД: «Incorrect key file», «Can’t open file», «Incorrect information in file» и др. |
| Эта проблема характерна для базы данных MySQL, таблиц в формате MyISAM.
Для решения проблемы в окне SQL-запроса выполните repair table b_search_content_stem b_search_content_stem — имя неработающей таблицы. Есть возможность выполнить восстановление всех таблиц при неработающем сайте. Для этого надо знать логин и пароль к базе данных, передать их на страницу проверки. Источник MySQL Server Has Gone Away — как пофикситьТехнический редактор Highload
Ошибка MySQL Server Has Gone Away (error 2006) может возникнуть в двух случаях. Собираем на дрон для штурмовиков Николаевской области. Он поможет найти и уничтожить врага Таймаут соединенияНаиболее распространенная проблема: таймаут соединения, в результате чего сервер его закрывает. Решение весьма тривиальное — увеличение лимита времени wait_timeout в файле конфигурации my.cnf . Для этого в Debian нужно выполнить: Открытие файла настроек MySQL Затем установить тайм-аут ожидания: Время ожидания в секундах, можно установить вплоть до 28800 с (8 часов) Не забудьте перезагрузить базу: Перезагрузка базы данных MySQL Иногда, при выполнении длительных запланированных задач, также может появиться ошибка MySQL Server Has Gone Away все из-за того же таймаута соединения. При этом лимит времени не получится существенно увеличить (максимум до нескольких часов), так как это может привести к заполнению буфера ожидающими соединениями. Поэтому лучше проверить соединение и, при необходимости, переподключиться. Подключение БД и переподключение при необходимости Большой или некорректный пакетВторая распространенная проблема: сервер получает большой или некорректный пакет и отклоняет его. В этом случае сервер считает, что проблема на стороне клиента и закрывает соединение. Так что для решения нужно увеличить лимит на максимальный размер пакета все в том же файле конфигурации: Увеличение лимита размера входящего пакета, в МБ Также не забудьте перезагрузить базу данных. Самое главноеПосле того, как устраните ошибку MySQL Server Has Gone Away, поиграйтесь с параметрами wait_timeout и max_allowed_packet для получения оптимальных лимитов. Этот текст был написан несколько лет назад. С тех пор упомянутые здесь инструменты и софт могли получить обновления. Пожалуйста, проверяйте их актуальность. Источник Adblock |
I have encountered this a number of times and I’ve normally found the answer to be a very low default setting of max_allowed_packet.
Raising it in /etc/my.cnf (under [mysqld]) to 8 or 16M usually fixes it. (The default in MySql 5.7 is 4194304, which is 4MB.)
[mysqld]
max_allowed_packet=16M
Note: Just create the line if it does not exist
Note: This can be set on your server as it’s running.
Note: On Windows you may need to save your my.ini or my.cnf file with ANSI not UTF-8 encoding.
Use set global max_allowed_packet=104857600. This sets it to 100MB.
answered Feb 28, 2012 at 9:48
GeorgeGeorge
4,8252 gold badges15 silver badges21 bronze badges
15
I had the same problem but changeing max_allowed_packet in the my.ini/my.cnf file under [mysqld] made the trick.
add a line
max_allowed_packet=500M
now restart the MySQL service once you are done.
answered Oct 17, 2013 at 11:51
Sathish DSathish D
4,83629 silver badges44 bronze badges
3
I used following command in MySQL command-line to restore a MySQL database which size more than 7GB, and it works.
set global max_allowed_packet=268435456;
answered Feb 24, 2016 at 10:31
3
It may be easier to check if the connection exists and re-establish it if needed.
See PHP:mysqli_ping for info on that.
answered Oct 29, 2011 at 23:15
3
There are several causes for this error.
MySQL/MariaDB related:
wait_timeout— Time in seconds that the server waits for a connection to become active before closing it.interactive_timeout— Time in seconds that the server waits for an interactive connection.max_allowed_packet— Maximum size in bytes of a packet or a generated/intermediate string. Set as large as the largest BLOB, in multiples of 1024.
Example of my.cnf:
[mysqld]
# 8 hours
wait_timeout = 28800
# 8 hours
interactive_timeout = 28800
max_allowed_packet = 256M
Server related:
- Your server has full memory — check info about RAM with
free -h
Framework related:
- Check settings of your framework. Django for example use
CONN_MAX_AGE(see docs)
How to debug it:
- Check values of MySQL/MariaDB variables.
- with sql:
SHOW VARIABLES LIKE '%time%'; - command line:
mysqladmin variables
- with sql:
- Turn on verbosity for errors:
- MariaDB:
log_warnings = 4 - MySQL:
log_error_verbosity = 3
- MariaDB:
- Check docs for more info about the error
answered Feb 21, 2019 at 9:48
jozojozo
3,8221 gold badge24 silver badges29 bronze badges
Error: 2006 (CR_SERVER_GONE_ERROR)
Message: MySQL server has gone away
Generally you can retry connecting and then doing the query again to solve this problem — try like 3-4 times before completely giving up.
I’ll assuming you are using PDO. If so then you would catch the PDO Exception, increment a counter and then try again if the counter is under a threshold.
If you have a query that is causing a timeout you can set this variable by executing:
SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300; -- OR current session only
Where 300 is the number of seconds you think the maximum time the query could take.
Further information on how to deal with Mysql connection issues.
EDIT: Two other settings you may want to also use is net_write_timeout and net_read_timeout.
answered Oct 29, 2011 at 23:22
In MAMP (non-pro version) I added
--max_allowed_packet=268435456
to ...MAMPbinstartMysql.sh
Credits and more details here
icedwater
4,6423 gold badges34 silver badges48 bronze badges
answered Feb 29, 2012 at 17:00
uweuwe
3,87011 gold badges36 silver badges49 bronze badges
0
If you are using xampp server :
Go to xampp -> mysql -> bin -> my.ini
Change below parameter :
max_allowed_packet = 500M
innodb_log_file_size = 128M
This helped me a lot 
answered Aug 3, 2019 at 8:32
1
I was getting this same error on my DigitalOcean Ubuntu server.
I tried changing the max_allowed_packet and the wait_timeout settings but neither of them fixed it.
It turns out that my server was out of RAM. I added a 1GB swap file and that fixed my problem.
Check your memory with free -h to see if that’s what’s causing it.
answered Sep 19, 2016 at 23:45
Pikamander2Pikamander2
6,8643 gold badges46 silver badges66 bronze badges
1
On windows those guys using xampp should use this path xampp/mysql/bin/my.ini and change max_allowed_packet(under section[mysqld])to your choice size.
e.g
max_allowed_packet=8M
Again on php.ini(xampp/php/php.ini) change upload_max_filesize the choice size.
e.g
upload_max_filesize=8M
Gave me a headache for sometime till i discovered this. Hope it helps.
answered Oct 16, 2015 at 16:02
3
It was RAM problem for me.
I was having the same problem even on a server with 12 CPU cores and 32 GB RAM. I researched more and tried to free up RAM. Here is the command I used on Ubuntu 14.04 to free up RAM:
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
And, it fixed everything. I have set it under cron to run every hour.
crontab -e
0 * * * * bash /root/ram.sh;
And, you can use this command to check how much free RAM available:
free -h
And, you will get something like this:
total used free shared buffers cached
Mem: 31G 12G 18G 59M 1.9G 973M
-/+ buffers/cache: 9.9G 21G
Swap: 8.0G 368M 7.6G
answered Mar 26, 2017 at 5:38
RehmatRehmat
2,0332 gold badges22 silver badges27 bronze badges
In my case it was low value of open_files_limit variable, which blocked the access of mysqld to data files.
I checked it with :
mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 1185 |
+------------------+-------+
1 row in set (0.00 sec)
After I changed the variable to big value, our server was alive again :
[mysqld]
open_files_limit = 100000
answered Sep 8, 2016 at 14:31
Fedir RYKHTIKFedir RYKHTIK
9,7446 gold badges56 silver badges67 bronze badges
This generally indicates MySQL server connectivity issues or timeouts.
Can generally be solved by changing wait_timeout and max_allowed_packet in my.cnf or similar.
I would suggest these values:
wait_timeout = 28800
max_allowed_packet = 8M
answered Jun 29, 2018 at 14:35
MemoMemo
1421 gold badge2 silver badges10 bronze badges
If you are using the 64Bit WAMPSERVER, please search for multiple occurrences of max_allowed_packet because WAMP uses the value set under [wampmysqld64] and not the value set under [mysqldump], which for me was the issue, I was updating the wrong one. Set this to something like max_allowed_packet = 64M.
Hopefully this helps other Wampserver-users out there.
answered Mar 14, 2018 at 14:54
Enomatix24Enomatix24
1561 silver badge7 bronze badges
0
There is an easier way if you are using XAMPP.
Open the XAMPP control panel, and click on the config button in mysql section.
Now click on the my.ini and it will open in the editor. Update the max_allowed_packet to your required size.
Then restart the mysql service. Click on stop on the Mysql service click start again. Wait for a few minutes.
Then try to run your Mysql query again. Hope it will work.
answered May 5, 2019 at 5:44
HrijuHriju
7201 gold badge17 silver badges27 bronze badges
It’s always a good idea to check the logs of the Mysql server, for the reason why it went away.
It will tell you.
answered Jun 30, 2018 at 18:06
AlexAlex
31.3k14 gold badges100 silver badges166 bronze badges
MAMP 5.3, you will not find my.cnf and adding them does not work as that max_allowed_packet is stored in variables.
One solution can be:
- Go to http://localhost/phpmyadmin
- Go to SQL tab
- Run SHOW VARIABLES and check the values, if it is small then run with big values
-
Run the following query, it set max_allowed_packet to 7gb:
set global max_allowed_packet=268435456;
For some, you may need to increase the following values as well:
set global wait_timeout = 600;
set innodb_log_file_size =268435456;
answered May 9, 2019 at 20:47
Rupak NepaliRupak Nepali
7191 gold badge6 silver badges13 bronze badges
For Vagrant Box, make sure you allocate enough memory to the box
config.vm.provider "virtualbox" do |vb|
vb.memory = "4096"
end
answered Dec 13, 2015 at 8:39
ShadowebShadoweb
5,5841 gold badge40 silver badges53 bronze badges
0
This might be a problem of your .sql file size.
If you are using xampp. Go to the xampp control panel -> Click MySql config -> Open my.ini.
Increase the packet size.
max_allowed_packet = 2M -> 10M
answered Jan 10, 2018 at 11:43
The unlikely scenario is you have a firewall between the client and the server that forces TCP reset into the connection.
I had that issue, and I found our corporate F5 firewall was configured to terminate inactive sessions that are idle for more than 5 mins.
Once again, this is the unlikely scenario.
answered May 23, 2017 at 18:36
AhmedAhmed
2,7641 gold badge24 silver badges39 bronze badges
uncomment the ligne below in your my.ini/my.cnf, this will split your large file into smaller portion
# binary logging format - mixed recommended
# binlog_format=mixed
TO
# binary logging format - mixed recommended
binlog_format=mixed
answered Sep 25, 2015 at 14:30
1
I found the solution to «#2006 — MySQL server has gone away» this error.
Solution is just you have to check two files
- config.inc.php
- config.sample.inc.php
Path of these files in windows is
C:wamp64appsphpmyadmin4.6.4
In these two files the value of this:
$cfg['Servers'][$i]['host']must be 'localhost' .
In my case it was:
$cfg['Servers'][$i]['host'] = '127.0.0.1';
change it to:
"$cfg['Servers'][$i]['host']" = 'localhost';
Make sure in both:
- config.inc.php
- config.sample.inc.php files it must be ‘localhost’.
And last set:
$cfg['Servers'][$i]['AllowNoPassword'] = true;
Then restart Wampserver.
To change phpmyadmin user name and password
You can directly change the user name and password of phpmyadmin through config.inc.php file
These two lines
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
Here you can give new user name and password.
After changes save the file and restart WAMP server.
answered Jun 10, 2017 at 8:18
I got Error 2006 message in different MySQL clients software on my Ubuntu desktop. It turned out that my JDBC driver version was too old.
answered Jun 16, 2017 at 15:58
I had the same problem in docker adding below setting in docker-compose.yml:
db:
image: mysql:8.0
command: --wait_timeout=800 --max_allowed_packet=256M --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password
volumes:
- ./docker/mysql/data:/var/lib/mysql
- ./docker/mysql/dump:/docker-entrypoint-initdb.d
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
answered Nov 11, 2020 at 17:14
DmitryDmitry
3,7703 gold badges23 silver badges40 bronze badges
1
I also encountered this error. But even with the increased max_allowed_packet or any increase of value in the my.cnf, the error still persists.
What I did is I troubleshoot my database:
- I checked the tables where the error persists
- Then I checked each row
- There are rows that are okay to fetch and there are rows where the error only shows up
- It seems that there are value in these rows that is causing this error
- But even by selecting only the primary column, the error still shows up (
SELECT primary_id FROM table)
The solution that I thought of is to reimport the database. Good thing is I have a backup of this database. But I only dropped the problematic table, then import my backup of this table. That solved my problem.
My takeaway of this problem:
- Always have a backup of your database. Either manually or thru CRON job
- I noticed that there are special characters in the affected rows. So when I recovered the table, I immediately changed the collation of this table from
latin1_swedish_citoutf8_general_ci - My database was working fine before then my system suddenly encountered this problem. Maybe it also has something to do with the upgrade of the MySQL database by our hosting provider. So frequent backup is a must!
answered May 3, 2021 at 1:49
Logan WayneLogan Wayne
5,99116 gold badges32 silver badges48 bronze badges
Just in case this helps anyone:
I got this error when I opened and closed connections in a function which would be called from several parts of the application.
We got too many connections so we thought it might be a good idea to reuse the existing connection or throw it away and make a new one like so:
public static function getConnection($database, $host, $user, $password){
if (!self::$instance) {
return self::newConnection($database, $host, $user, $password);
} elseif ($database . $host . $user != self::$connectionDetails) {
self::$instance->query('KILL CONNECTION_ID()');
self::$instance = null;
return self::newConnection($database, $host, $user, $password);
}
return self::$instance;
}
Well turns out we’ve been a little too thorough with the killing and so the processes doing important things on the old connection could never finish their business.
So we dropped these lines
self::$instance->query('KILL CONNECTION_ID()');
self::$instance = null;
and as the hardware and setup of the machine allows it we increased the number of allowed connections on the server by adding
max_connections = 500
to our configuration file. This fixed our problem for now and we learned something about killing mysql connections.
answered May 20, 2020 at 7:10
MaxMax
2,4811 gold badge22 silver badges27 bronze badges
For users using XAMPP, there are 2 max_allowed_packet parameters in C:xamppmysqlbinmy.ini.
answered Jun 26, 2018 at 12:10
SubhashSubhash
1581 silver badge9 bronze badges
This error happens basically for two reasons.
- You have a too low RAM.
- The database connection is closed when you try to connect.
You can try this code below.
# Simplification to execute an SQL string of getting a data from the database
def get(self, sql_string, sql_vars=(), debug_sql=0):
try:
self.cursor.execute(sql_string, sql_vars)
return self.cursor.fetchall()
except (AttributeError, MySQLdb.OperationalError):
self.__init__()
self.cursor.execute(sql_string, sql_vars)
return self.cursor.fetchall()
It mitigates the error whatever the reason behind it, especially for the second reason.
If it’s caused by low RAM, you either have to raise database connection efficiency from the code, from the database configuration, or simply raise the RAM.
answered Sep 21, 2018 at 10:54
Aminah NurainiAminah Nuraini
17.5k8 gold badges87 silver badges106 bronze badges
For me it helped to fix one’s innodb table’s corrupted index tree. I localized such a table by this command
mysqlcheck -uroot --databases databaseName
result
mysqlcheck: Got error: 2013: Lost connection to MySQL server during query when executing 'CHECK TABLE ...
as followed I was able to see only from the mysqld logs /var/log/mysqld.log which table was causing troubles.
FIL_PAGE_PREV links 2021-08-25T14:05:22.182328Z 2 [ERROR] InnoDB: Corruption of an index tree: table `database`.`tableName` index `PRIMARY`, father ptr page no 1592, child page no 1234'
The mysqlcheck command did not fix it, but helped to unveil it.
Ultimately I fixed it as followed by a regular mysql command from a mysql cli
OPTIMIZE table theCorruptedTableNameMentionedAboveInTheMysqld.log
answered Aug 25, 2021 at 16:04
FantomX1FantomX1
1,4672 gold badges15 silver badges21 bronze badges
Эта ошибка означает, что MySQL сервер запущен, но он отказывает вам в соединении. Это может произойти по нескольким причинам. Самых основных и часто встречающихся причин три: сервер перегружен, и у вас истекло время ожидания ответа, ваш клиент отправил слишком большой пакет или сервер был не до конца проинициализирован.
В этой небольшой статье мы рассмотрим более подробно, почему возникает ошибка 2006: MySQL server has gone away, а также — как её исправить.
Такую ошибку вы можете увидеть во время подключения к базе данных с помощью PHP, консольного клиента или, например, в PhpMyAdmin:
1. Истекло время ожидания
Как я уже писал выше, одной из причин может быть таймаут ожидания соединения. Возможно, сервер баз данных перегружен и не успевает обрабатывать все соединения. Вы можете подключиться к серверу с помощью консольного клиента, если вам это удастся, и попытаться выполнить какой-либо запрос, чтобы понять, действительно ли запросы выполняются слишком долго. Если это так, можно оптимизировать производительность MySQL с помощью скрипта MySQLTuner.
В большинстве случаев надо увеличить размер пула движка InnoDB с помощью параметра innodb_buffer_pool_size. Какое значение лучше поставить, можно узнать с помощью указанного выше скрипта. Например, 800 мегабайт:
sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Есть и другой путь решения этой проблемы. Если такая скорость обработки запросов считается нормальной, можно увеличить время ожидания ответа от сервера. Для этого измените значение параметра wait_timeout. Это время в секундах, на протяжении которого надо ждать ответа от сервера. Например:
wait_timeout=600
После любых изменений не забудьте перезапустить MySQL сервер:
sudo systemctl restart mysql
или:
sudo systemctl restart mariadb
2. Слишком большой пакет
Если ваш клиент MySQL создаёт слишком большие пакеты с запросами к серверу, это тоже может стать причиной такой ошибки. Максимально доступный размер пакета можно увеличить с помощью параметра max_allowed_packet. Например:
sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Обратите внимание, что если вы из своей программы отправляете большие пакеты, то, скорее всего, вы делаете что-то не так. Не надо генерировать запросы к MySQL с помощью циклов for. SQL — это отдельный язык программирования, который многое может сделать сам, без необходимости писать очень длинные запросы.
3. Сервер неверно проинициализирован
Такая проблема может возникать при разворачивании контейнера MySQL или MariaDB в Docker. Дело в том, что на первоначальную инициализацию контейнера нужно много времени: около нескольких минут. Если вы не дадите контейнеру завершить инициализацию, а остановите его и потом снова запустите, то база данных будет всегда возвращать такую ошибку.
Вам нужно полностью удалить данные контейнера с базой данных. Например, с помощью docker-compose:
docker-compose down
или вручную:
docker rm mysql-container
Здесь mysql-container — это имя контейнера с базой данных. А затем надо удалить хранилище (volume) с некорректно проинициализированной базой. Сначала посмотрите список всех хранилищ:
docker volume ls
Затем удалите нужное:
docker volume rm имя_хранилища
После этого можете снова запускать инициализацию приложения, только на этот раз дождитесь, пока сервер баз данных сообщит, что он готов, и вы сможете к нему подключиться.
Выводы
В этой небольшой статье мы рассмотрели, что значит ошибка MySQL Server has gone away, а также как её исправить на сервере или в контейнере Docker. Вы знаете ещё другие причины и решения этой проблемы? Пишите в комментариях!
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Об авторе
Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.
Две наиболее распространенные причины получения ошибки MySQL server has gone away (error 2006) это..
- Сервер закрыл соединение по таймауту.
Исправить можно так: проверить чтобы значение переменной wait_timeout в конфиг файле MySql — my.cnf было достаточным для выполнения скрипта.
На Debian: нужно выполнитьsudo nano /etc/mysql/my.cnf
и установить wait_timeout = 600 ( значение задается в секундах, если ошибка не пропадет поиграйтесь с этим значением, чтобы найти оптимальное), после этого нужно рестартануть MySQL:
sudo /etc/init.d/mysql restart
Я не проверял, но значение по-умолчанию для wait_timeout можно установить вплоть до 28800 секунд (8 часов).
- Сервер сбрасывает (отклоняет) неправильные или слишком большие пакеты. Если mysqld получает пакет данных, который слишком большой или не корректный, он думает что что-то пошло не так или с клиентом случилась какая-то беда и закрывает соединение. Часто такая ошибка возникает при импорте дампов содержащих большие тексты.
Так же такое происходит, когда у Вас слишком большой запрос. Например, вы хотите в поле типа longtext записать какую-нибудь книгу, в которой текста на 20 мб. Либо хотите сохранить большой файл (например картинку) в поле с типом blob. В итоге у вас получается запрос по типу
UPDATE books SET text=«сууупер..длинный..текст» WHERE id=1
Если это Ваш случай, то подумайте действительно ли Вам нужно сохранять такой текст/файл в базу, обычная практика в таких случаях, сохранить его в файл на диск, а в базу сохранить имя этого файла. Типа того
file_put_content(‘book.txt’, ‘сууупер..длинный..текст’);
...
UPDATE books SET filename=«book.txt» WHERE id=1
Исправить можно так: вы можете увеличить максимальный размер пакета увеличив значение max_allowed_packet в файле my.cnf.
На Debian нужно выполнить:sudo nano /etc/mysql/my.cnf
и установить max_allowed_packet = 64M (если ошибка не пропадет поиграйтесь с этим значением, чтобы найти оптимальное), после этого нужно рестартануть MySQL
sudo /etc/init.d/mysql restart
Про max_allowed_packet я так же писал здесь: ERROR 2006 (HY000) — MySQL server has gone away
Если Вы получаете ошибку MySQL server has gone away (error 2006) при использовании драйвера MySQL ODBC – можете попробовать это решение.
Оригинал исходной статьи (на англ): How to fix “MySQL server has gone away” (error 2006)
Похожие статьи
Автор:
| Рейтинг: 5/5 |
Теги:
Ошибка 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
Дальше надо удалить хранилище (volume) с некорректно проинициализированной базой. Но в начале просмотрите список всех хранилищ:
$ docker volume ls
После удаляем:
$ docker volume rm имя_хранилища
Теперь можете запустить инициализацию приложения, только дождитесь, пока сервер баз данных сообщит, что он готов, и вы сможете к нему подключиться.
В логах ошибок PHP иногда можно встретить записи типа MySQL Server Has Gone Away (error 2006). Они означают, что соединение с сервером баз данных (ожидание сессии) прервалось по таймауту. Ошибку можно легко исправить.
Ошибка MySQL Server Has Gone Away (error 2006) может возникнуть в двух случаях:
- Соединение с MYSQL прерывается по таймауту, передача данных не успевает завершится в рамках сессии.
- Пакет, который передается слишком большой или некорректный
Быстрым решением является увеличение значений двух глобальных переменных MySQL. Делается это в основном конфигурационном файле сервера баз данных /etc/mysql/my.cnf или в консоли MySQL авторизовавшись как root
В консоли это выглядит так:
set @@GLOBAL.max_allowed_packet=96000000;
set @@GLOBAL.wait_timeout=1000;
Решение с внесением изменений в файл /etc/mysql/my.cnf.
ВАРИАНТ 1 — Таймаут соединения С БД
Программный код может делать запрос в базу данных, который обрабатывается больше максимального времени выполнения запроса, установленного в конфигурационном файле. При этом срабатывает ограничение на время ожидания в сессии.
Лучше всего выяснить почему такие запросы имеют место и оптимизировать их, но для того чтобы получить мгновенный результат нужно увеличить значение параметра wait_timeout. Значение задается в секундах и не может быть более 28800.
mcedit /etc/mysql/my.cnf
wait_timeout = 1000
После внесения любых изменений в конфигурационный файл перезапускаем MySQL
/etc/init.d/mysql restart
ВАРИАНТ 2 — СЛИШКОМ Большой пакет
Несколько другая ситуация имеет место когда сервер отклоняет пакет из-за его слишком большого размера (или в случае если сервер не может распознать пакет по той или иной причине). В логи при этом пишутся точно такие же сообщения.
Решение в этом случае практически такое же — необходимо скорректировать значение одной переменной в конфигурационном файле.
mcedit /etc/mysql/my.cnf
[mysqld]
max_allowed_packet = 96M
В примере задан максимальный размер пакета, который сервер не будет отвергать — 96 Мб. Устанавливать слишком большие значения не стоит.
Также перезапускаем MySQL
/etc/init.d/mysql restart
Таким образом, РНР ошибка mysql server has gone away в большинстве случаев побеждается корректировкой значений двух переменных и перезапуском сервера баз данных.

















