Ошибка при загрузке модуля mysql server has gone away

Эта ошибка означает, что 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. Вы знаете ещё другие причины и решения этой проблемы? Пишите в комментариях!

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Об авторе

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.

Недавно столкнулся с такой проблемой и решил здесь поделиться решением, которое

нашел в интернете

.
Вкратце опишу, где встретилась такая ошибка: на сайте есть модуль парсера, сначала он собирает данные, а затем загружает их в инфоблоки. Так вот малое количество данных успешно загружалось, а вот большое на строке с

CIBlockElement::GetList

выдавало ошибку «MySQL server has gone away».
Не сразу понял в чем дело, но в итоге разобрался — MySQL сбрасывал соединение, т.к. долго не было подключения к базе после подключения к серверу (или как-то так, не силен в терминологии).
В общем решение вот такое — в файле «bitrix/php_interface/after_connect.php» нужно добавить строку:

$DB->Query("SET wait_timeout=28800");

Число в скобках — это количество секунд ожидания подключения.

Рассмотрим, как исправить ошибку MySQL server has gone away (error 2006), которая появляется при обращении к сервису MySQL.

Наиболее распространение причины ошибки MySQL server has gone away:

  • Слишком большой размер пакета в запросе к MySQL (по умолчанию максимальный размер — 16 Мб);
  • Закончилась свободная оперативная память (RAM) на сервере MySQL (проверить свободную память в Linux можно с помощью команды free –h)
  • Неактивное соединение между вашим приложением и MySQL (по умолчанию сессия разрывается через 8 часов).

ошибка mysql server has gone away (error 2006)

General error: 2006 MySQL server has gone away
Error Code: 2013. Lost connection to MySQL server during query
PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

Чтобы увеличить таймаут для подключений к MySQL, нужно добавить следующие опции в конфигурационный файл mysqld.cnf:

sudo nano /etc/mysql/my.cnf

Найдите секцию [mysqld] и увеличьте таймаут до 24 часов:

wait_timeout = 86400
interactive_timeout = 86400

Если вы загружаете в MySQL большие файлы или BLOB объекты более 16 Мб, то MySQL с настройками по-умолчанию также может вернуть ошибку MySQL server has gone away. Нужно увеличить максимальный размер пакета в my.cnf.

Для этого в секции [mysqld] увеличьте значение параметра max_allowed_packet со стандартного 16M до 128MB:

max_allowed_packet = 128MB

После внесения изменений в файл mysqld.cnf нужно перезапустить сервис MySQL:

  • В CentOS/RHEL:sudo systemctl restart mysqld
  • В Ubuntu: sudo systemctl restart mysql.service

Если вы подключаетесь к MySQL из PHP, проверьте что значения таймаутов в php.ini больше, чем в MySQL

mysql.connect_timeout=86400
mysql.allow_persistent=1

In general the error:

Error: 2006 (CR_SERVER_GONE_ERROR) — MySQL server has gone away

means that the client couldn’t send a question to the server.


mysql import

In your specific case while importing the database file via mysql, this most likely mean that some of the queries in the SQL file are too large to import and they couldn’t be executed on the server, therefore client fails on the first occurred error.

So you’ve the following possibilities:

  • Add force option (-f) for mysql to proceed and execute rest of the queries.

    This is useful if the database has some large queries related to cache which aren’t relevant anyway.

  • Increase max_allowed_packet and wait_timeout in your server config (e.g. ~/.my.cnf).

  • Dump the database using --skip-extended-insert option to break down the large queries. Then import it again.

  • Try applying --max-allowed-packet option for mysql.


Common reasons

In general this error could mean several things, such as:

  • a query to the server is incorrect or too large,

    Solution: Increase max_allowed_packet variable.

    • Make sure the variable is under [mysqld] section, not [mysql].

    • Don’t afraid to use large numbers for testing (like 1G).

    • Don’t forget to restart the MySQL/MariaDB server.

    • Double check the value was set properly by:

      mysql -sve "SELECT @@max_allowed_packet" # or:
      mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
      
  • You got a timeout from the TCP/IP connection on the client side.

    Solution: Increase wait_timeout variable.

  • You tried to run a query after the connection to the server has been closed.

    Solution: A logic error in the application should be corrected.

  • Host name lookups failed (e.g. DNS server issue), or server has been started with --skip-networking option.

    Another possibility is that your firewall blocks the MySQL port (e.g. 3306 by default).

  • The running thread has been killed, so retry again.

  • You have encountered a bug where the server died while executing the query.

  • A client running on a different host does not have the necessary privileges to connect.

  • And many more, so learn more at: B.5.2.9 MySQL server has gone away.


Debugging

Here are few expert-level debug ideas:

  • Check the logs, e.g.

    sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
    
  • Test your connection via mysql, telnet or ping functions (e.g. mysql_ping in PHP).

  • Use tcpdump to sniff the MySQL communication (won’t work for socket connection), e.g.:

    sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
    
  • On Linux, use strace. On BSD/Mac use dtrace/dtruss, e.g.

    sudo dtruss -a -fn mysqld 2>&1
    

    See: Getting started with DTracing MySQL

Learn more how to debug MySQL server or client at: 26.5 Debugging and Porting MySQL.

For reference, check the source code in sql-common/client.c file responsible for throwing the CR_SERVER_GONE_ERROR error for the client command.

MYSQL_TRACE(SEND_COMMAND, mysql, (command, header_length, arg_length, header, arg));
if (net_write_command(net,(uchar) command, header, header_length,
          arg, arg_length))
{
  set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
  goto end;
}

0 Пользователей и 1 Гость просматривают эту тему.

  • 13 Ответов
  • 4727 Просмотров

Добрый день! Может кто сталкивался с проблемой, у меня на главной странице сайта выскакивает сообщение:

Проверьте настройки в configuration.php. Либо перезагрузка/переустановка MySQL в случае, если сайт на локальной машине, либо в техподдержку хостинга, в случае, если сайт лежит на хостинге.

Если бы я знал, что там проверять >:( Может кто сможет посмотреть на наличие ошибок данный файл? Хостинг-провайдер ответил, что проблемы непосредственно в работе скрипта

var $user = ‘…’; //пользователь MySQL
var $db = ‘…’; //Имя базы
var $host = ‘…; // localhost, если локальный, либо адрес хоста (базы)

Еще пароль к базе
var $password = ‘…’;

Помогите, у меня такая же проблема. файл конфиг проверил: все правильно.

Ответ поддержки хостинга: «У Вас проблема в выполнении запросов к БД. Вам необходимо оптимизировать работу Вашего сайта и обращений к БД.» А как оптимизировать работу сайта и обращений к БД?

Добрый день! Может кто сталкивался с проблемой, у меня на главной странице сайта выскакивает сообщение:

С такой проблемой не сталкивался, но первое что приходит в голову (и наверное самое правильное) это попробовать отработать один из запросов через phpMyAdmin.
Берете свой первый не прошедший запрос:

SELECT id, title, module, position, content, showtitle, control, params FROM jos_modules AS m LEFT JOIN jos_modules_menu AS mm ON mm.moduleid = m.id WHERE m.published = 1 AND m.access <= 0 AND m.client_id = 0 AND ( mm.menuid = 1 OR mm.menuid = 0 ) ORDER BY position, ordering

и пробуете его отработать в ручную, для этого в phpMyAdmin в верхнем меню выбираете пункт SQL и введите туда запрос.

Вот еще мысль. В запросе напрягает ORDER BY position, ordering.
Сортировка должна идти по полю таблицы и быть либо desc либо asc — т.е. по убыванию или возрастанию. А в запросе почему-то position и ordering. Конечно может в сообщении об ошибке так и должно быть. Но по-моему там все же должно стоять к примеру m.чего-нибудь,asc.  

и пробуете его отработать в ручную, для этого в phpMyAdmin в верхнем меню выбираете пункт SQL и введите туда запрос.

сделал еще до обращения на форум — выдал перечень модулей без ошибок

сделал еще до обращения на форум — выдал перечень модулей без ошибок

А на локалке сайт без ошибок работает? Если есть возможность проверьте.

Вот еще мысль. В запросе напрягает ORDER BY position, ordering.
Сортировка должна идти по полю таблицы и быть либо desc либо asc — т.е. по убыванию или возрастанию. А в запросе почему-то position и ordering. Конечно может в сообщении об ошибке так и должно быть. Но по-моему там все же должно стоять к примеру m.чего-нибудь,asc.  

position это поле, по которому надо сортировать. Если не указано asc, desc, то по умолчанию аск. Проблемы тут не вижу. Более того, если отключить все модули, то ошибок в запросе нет и получаем пустое множество записей, но при этом ошибка на главной не пропадает.

Кстати, у меня текст ошибки:
Ошибка при загрузке модулей:MySQL server has gone away SQL=SELECT id, title, module, position, content, showtitle, control, params FROM jos_modules AS m LEFT JOIN jos_modules_menu AS mm ON mm.moduleid = m.id WHERE m.published = 1 AND m.access <= 0 AND m.client_id = 0 AND ( mm.menuid = 1 OR mm.menuid = 0 ) ORDER BY position, ordering

по предложению хостера восстановил сайт из архива — все заработало. Может этот ответ кому-то поможет.

Дело скорее всего не в архиве, хостер что-то сделал и делает.

« Последнее редактирование: 24.11.2012, 18:57:17 от vremennyy »

Записан

Добрый день. Ошибка видимо у меня почти такая же. После переноса сайт на новый виртуальный хостинг

http://prntscr.com/i80z9d

Так какое решение в итоге помогло? Нужно переустановить базу данных? Так и не понял из всей ветки.

« Последнее редактирование: 31.01.2018, 11:18:35 от Evrokub »

Записан


Debian, Linux, Ubuntu, Windows, Windows 10, Windows 11, Windows 7, Windows 8, Windows Server, Windows Vista, Windows XP

  • 24.11.2021
  • 2 794
  • 0
  • 1
  • 1
  • 0

Исправляем ошибку: MySQL server has gone away

  • Содержание статьи
    • Описание
    • Причины возникновения
    • Как исправить ошибку
      • Разрыв соединения из-за таймаута
      • Разрыв соединения из-за слишком большого размера пакета
      • Закончившаяся память
    • Добавить комментарий

Описание

В данной статье пойдет речь об ошибке, которую можно получить при обращении к MySQL Server:

MySQL server has gone away

Причины возникновения

Наиболее частыми причинами возникновения ошибки являются следующие причины:

  • Слишком долгое неактивное соединение между скриптом/приложением и MySQL сервером (по умолчанию составляет 8 часов, потом разрывается и вылезает эта ошибка)
  • Слишком большой размер пакета при запросе к серверу MySQL (по умолчанию = 16M, если размер пакета больше, например, из-за какого-нибудь BLOB объекта, который превышает данный размер, то вылетает эта ошибка)
  • Закончившаяся оперативная память на сервере с MySQL (проверить можно командой free -h на ОС Linux)

Как исправить ошибку

Разрыв соединения из-за таймаута

Если ваш скрипт или программа устанавливает соединение с MySQL сервером, но после этого ничего не передает, то спустя некоторое время (по умолчанию обычно эта настройка равна 8 часам) сервер просто закрывает соединение и при попытке что-либо записать в базу — получаем ошибку «MySQL server has gone away». Чтобы увеличить таймаут, необходимо внести правки в конфиг MySQL сервера (обычно mysqld.cnf) в секции [mysqld]. В данном примере мы увеличим срок такого таймаута до 24 часов. Для этого вносим следующие настройки в секцию [mysqld]:

# 24 hours
wait_timeout = 86400
# 24 hours
interactive_timeout = 86400

В итоге должно получиться что то подобное:

После этого сохраняем изменения в конфиге и перезапускаем MySQL, чтобы применить настройки.

Разрыв соединения из-за слишком большого размера пакета

В том случае, если у вас очень большие по размеру пакеты (например, какой-нибудь BLOB объект, который хранится в базе, вроде фото, видео и т.п.), то в этом случае MySQL сервер может также выдавать аналогичную ошибку «MySQL server has gone away». Чтобы избавиться от этой ошибки, необходимо увеличит в конфиге максимальный размер пакета. Для этого открываем конфиг MySQL, (обычно mysqld.cnf), ищем в нем опцию max_allowed_packet, которая должна находиться в секции[mysqld] и меняем текущее значение на бОльшее. В нашем примере мы меняем стандартное значение 16M, на 256M. Должно быть как на скриншоте ниже:

После этого сохраняем изменения в конфиге и перезапускаем MySQL, чтобы применить настройки.

Закончившаяся память

Для корректной работы MySQL сервера и любой другой программы требуется оперативная память. Если вы заметили, что у вас выскакивает ошибка «MySQL server has gone away» и в эти моменты на сервере нет свободной оперативной памяти — значит вам надо эту причину каким-либо образом устранить. Отключить лишние сервисы, которые потребляют память, найти другие запущенные процессы, которые потребляют слишком много ресурсов и ограничит их, либо банально увеличить доступную память, путем установки новой планки(ок).

MySQL Server Has Gone AwayWe all like when error messages are descriptive and give a clear idea about what is happening; however, there are some cases when a few possible reasons lay behind one error message. “MySQL server has gone away” is one of them. Most of the cases when the error occurs are described in MySQL documentation, but it can get tricky. And here, I’d like to talk about “tricky”.

There are only a few major cases when this happens:

1. MySQL Thread Was Killed by an Administrator or a Utility Such as pt-kill

The manual intervention is likely to be intermittent and, as it is a one-time thing in certain situations (e.g., a bad long-running query), probably would be known to a DBA. Pt-kill might be less noticeable, as it is often left running as a workaround to prevent those bad long queries from taxing system resources. Checking the system processlist should bring the commands to the surface:

$ ps xauf | grep ptkill

taras 6069 0.1 0.1 111416 29452 pts/29 S+ 10:57 0:00 | | _ perl /usr/bin/ptkill interval 1s busytime 5s matchinfo (SELECT) h=127.0.0.1 print kill

taras 6913 0.0 0.0 21532 1112 pts/30 S+ 11:00 0:00 | _ grep color=auto ptkill

A very convenient way is to use the audit plugin available for Percona Server for MySQL to determine where the kill command came from:

<AUDIT_RECORD>

  <NAME>Query</NAME>

  <RECORD>624484743_20200630T17:38:14</RECORD>

  <TIMESTAMP>20200630T17:57:35 UTC</TIMESTAMP>

  <COMMAND_CLASS>kill</COMMAND_CLASS>

  <CONNECTION_ID>17</CONNECTION_ID>

  <STATUS>0</STATUS>

  <SQLTEXT>KILL QUERY 16</SQLTEXT>

  <USER>taras[taras] @ localhost []</USER>

  <HOST>localhost</HOST>

  <OS_USER></OS_USER>

  <IP></IP>

  <DB></DB>

</AUDIT_RECORD>

It shows the hostname, user, and time when the connection got killed.

2. Big Data Chunk Transfer

For example, when using BLOB fields to store binary data in a table or there is an INSERT statement containing a lot of rows. It may happen when using the MySQL CLI client (one of the cases being loading an SQL dump), or it can happen within an application when it tries to store the BLOB data (for example, from a file upload).

There is a limit MySQL imposes on the amount of data that can be transmitted per query, and the max_allowed_packet variable defines it.

So, in both cases, we need to determine which table the data is being written to, for instance, grepping the SQL file for INSERT INTO statements and implementing logging on the application end. This way, the statement will be stored along with the error that prevented it from completing. A partial statement can be captured (as BLOBs could be a burden to log), but as long as there is a table name, it is possible to check the table structure and see if it does contain binary data.

Example of an INSERT statement with binary data (truncated):

INSERT INTO t1 VALUES (1, x89504….82)

To allow for a larger query execution, the variable needs to be adjusted:

SET GLOBAL max_allowed_packet = 128M ;

The variable can be set per session or globally, depending on the use case.

3. The Connection Was Closed by Timeout

It is trivial, but applications can be reusing already-established connections. During the time of inactivity or lower traffic, it is possible some connections will not be used for a while and closed on the MySQL end. It is traced best with the application logging; if there is an event that happened in the evening followed by a period of inactivity and then the error in the morning, it is very likely that MySQL closed the connection.

mysql> SET SESSION wait_timeout = 5 ;

Query OK, 0 rows affected (0.00 sec)

Wait for 5 seconds:

mysql> select 1 ;

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id: 16

Current database: *** NONE ***

+—+

| 1 |

+—+

| 1 |

+—+

1 row in set (0.01 sec)

Usually, the connection is re-established, and the application continues normal operations; yet it is always possible to extend the timeout in MySQL configuration:

SET GLOBAL wait_timeout = 57600 ;

The default value for the variable is 28800 seconds (8 hours), which is enough in most cases.

Also, closing connections cleanly from an application end, after a period of inactivity, eliminates this problem.

4. MySQL Server Has Actually Gone Away

This one is probably the worst possible scenario when MySQL crashes on a query or due to some other reason, e.g., the OOM killer killed the process. However, it can be caused by a clean restart, too.

In this case, one should check MySQL uptime and the logs, MySQL error log, and syslog. Those should indicate whether the server restart occurred and if there was an error leading to the restart.

In case the server did crash, it is time to find the actual cause. Check the bug tracker, as the issue might have been reported and possibly fixed already; upgrade MySQL if needed. In case it was a clean restart, check if auto-updates are enabled or if someone else restarted the service interactively (yes, lack of communication is a thing too).

Эта ошибка означает, что 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 License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Об авторе

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.

В логах ошибок PHP иногда можно встретить записи типа MySQL Server Has Gone Away (error 2006). Они означают, что соединение с сервером баз данных (ожидание сессии) прервалось по таймауту. Ошибку можно легко исправить.

Ошибка MySQL Server Has Gone Away (error 2006) может возникнуть в двух случаях:

  1. Соединение с MYSQL прерывается по таймауту, передача данных не успевает завершится в рамках сессии.
  2. Пакет, который передается слишком большой или некорректный

Error mysql server has gone away

Быстрым решением является увеличение значений двух глобальных переменных 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 в большинстве случаев побеждается корректировкой значений двух переменных и перезапуском сервера баз данных.

0 Пользователей и 1 Гость просматривают эту тему.

  • 13 Ответов
  • 4810 Просмотров

Добрый день! Может кто сталкивался с проблемой, у меня на главной странице сайта выскакивает сообщение:

Проверьте настройки в configuration.php. Либо перезагрузка/переустановка MySQL в случае, если сайт на локальной машине, либо в техподдержку хостинга, в случае, если сайт лежит на хостинге.

Если бы я знал, что там проверять >:( Может кто сможет посмотреть на наличие ошибок данный файл? Хостинг-провайдер ответил, что проблемы непосредственно в работе скрипта

var $user = ‘…’; //пользователь MySQL
var $db = ‘…’; //Имя базы
var $host = ‘…; // localhost, если локальный, либо адрес хоста (базы)

Еще пароль к базе
var $password = ‘…’;

Помогите, у меня такая же проблема. файл конфиг проверил: все правильно.

Ответ поддержки хостинга: «У Вас проблема в выполнении запросов к БД. Вам необходимо оптимизировать работу Вашего сайта и обращений к БД.» А как оптимизировать работу сайта и обращений к БД?

Добрый день! Может кто сталкивался с проблемой, у меня на главной странице сайта выскакивает сообщение:

С такой проблемой не сталкивался, но первое что приходит в голову (и наверное самое правильное) это попробовать отработать один из запросов через phpMyAdmin.
Берете свой первый не прошедший запрос:

SELECT id, title, module, position, content, showtitle, control, params FROM jos_modules AS m LEFT JOIN jos_modules_menu AS mm ON mm.moduleid = m.id WHERE m.published = 1 AND m.access <= 0 AND m.client_id = 0 AND ( mm.menuid = 1 OR mm.menuid = 0 ) ORDER BY position, ordering

и пробуете его отработать в ручную, для этого в phpMyAdmin в верхнем меню выбираете пункт SQL и введите туда запрос.

Вот еще мысль. В запросе напрягает ORDER BY position, ordering.
Сортировка должна идти по полю таблицы и быть либо desc либо asc — т.е. по убыванию или возрастанию. А в запросе почему-то position и ordering. Конечно может в сообщении об ошибке так и должно быть. Но по-моему там все же должно стоять к примеру m.чего-нибудь,asc.  

и пробуете его отработать в ручную, для этого в phpMyAdmin в верхнем меню выбираете пункт SQL и введите туда запрос.

сделал еще до обращения на форум — выдал перечень модулей без ошибок

сделал еще до обращения на форум — выдал перечень модулей без ошибок

А на локалке сайт без ошибок работает? Если есть возможность проверьте.

Вот еще мысль. В запросе напрягает ORDER BY position, ordering.
Сортировка должна идти по полю таблицы и быть либо desc либо asc — т.е. по убыванию или возрастанию. А в запросе почему-то position и ordering. Конечно может в сообщении об ошибке так и должно быть. Но по-моему там все же должно стоять к примеру m.чего-нибудь,asc.  

position это поле, по которому надо сортировать. Если не указано asc, desc, то по умолчанию аск. Проблемы тут не вижу. Более того, если отключить все модули, то ошибок в запросе нет и получаем пустое множество записей, но при этом ошибка на главной не пропадает.

Кстати, у меня текст ошибки:
Ошибка при загрузке модулей:MySQL server has gone away SQL=SELECT id, title, module, position, content, showtitle, control, params FROM jos_modules AS m LEFT JOIN jos_modules_menu AS mm ON mm.moduleid = m.id WHERE m.published = 1 AND m.access <= 0 AND m.client_id = 0 AND ( mm.menuid = 1 OR mm.menuid = 0 ) ORDER BY position, ordering

по предложению хостера восстановил сайт из архива — все заработало. Может этот ответ кому-то поможет.

Дело скорее всего не в архиве, хостер что-то сделал и делает.

« Последнее редактирование: 24.11.2012, 18:57:17 от vremennyy »

Записан

Добрый день. Ошибка видимо у меня почти такая же. После переноса сайт на новый виртуальный хостинг

http://prntscr.com/i80z9d

Так какое решение в итоге помогло? Нужно переустановить базу данных? Так и не понял из всей ветки.

« Последнее редактирование: 31.01.2018, 11:18:35 от Evrokub »

Записан

For GoDaddy shared hosting

On GoDaddy shared hosting accounts, it is tricky to tweak the PHP.ini etc files. However, there is another way and it just worked perfectly for me. (I just successfully uploaded a 3.8Mb .sql text file, containing 3100 rows and 145 cols. Using the IMPORT command in phpMyAdmin, I was getting the dreaded MySQL server has gone away error, and no further information.)

I found that Matt Butcher had the right answer. Like Matt, I had tried all kinds of tricks, from exporting MySQL databases in bite-sized chunks, to writing scripts that break large imports into smaller ones. But here is what worked:

(1) CPANEL —> FILES (group) —> BACKUP

(2a) Under «Partial Backups» heading…
(2b) Under «Download a MySQL Database Backup»
(2c) Choose your database and download a backup (this step optional, but wise)

(3a) Directly to the right of 2b, under heading «Restore a MySQL Database Backup»
(3b) Choose the .SQL import file from your local drive
(3c) True happiness will be yours (shortly….) Mine took about 5 seconds

I was able to use this method to import a single table. Nothing else in my database was affected — but that is what step (2) above is intended to protect against.

Notes:
a. If you are unsure how to create a .SQL import file, use phpMyAdmin to export a table and modify that file structure.

SOURCE:
Matt Butcher 2010 Article

  • Ошибка при загрузке обновления мта провинция произошла одна или несколько ошибок
  • Ошибка при загрузке меню microsoft visual studio чтобы устранить неполадку запустите
  • Ошибка при загрузке обновления дота 2
  • Ошибка при загрузке маски вк
  • Ошибка при загрузке обновления виндовс 10