X

Как исправить “MySQL server has gone away” (error 2006)

Две наиболее распространенные причины получения ошибки MySQL server has gone away (error 2006) это..

  1. Сервер закрыл соединение по таймауту.

    Исправить можно так:
    проверить чтобы значение переменной 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 часов).

  2. Сервер сбрасывает (отклоняет) неправильные или слишком большие пакеты. Если 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)

Категории: MySQLБазы данных

Комментарии (22)

  • В очередной раз ища решения проблемы натыкаюсь на твой сайт, спасибо Веталь!

    • Пожалуйста. Пиши, звони, приходи в гости :D

  • Виталий Большое Спасибо ВАМ!! Будьте здоровы!!

  • А если сайт хостится на стороннем хостере, например, на nic.ru.
    Там вряд ли будет доступ до этих настроек. Как болроться с подобной ошибкой?
    Кстати, ошибка возникает периодически и никаких особо-тяжелых запросов не делает.
    Буду благодарен за любые советы.

    • В таком случае лучше всего обратиться в хостеру, чтобы он изучил проблему на своей стороне и либо сделал дополнительные настройки, либо дал рекомендации к оптимизации сайта (в частности, они могут логировать проблемные запросы). Если же хостер не сможет решить эту проблему, советую его сменить.

  • Здравствуйте я могу вам отправит скрипт полный вы мне оптимизация сделали я кого спрошу не понимают MySQL server has gone away это пойавится и тормозит прощу помощь

    • Привет, я понятия не имею что вызывает ошибку в твоём случае, поэтому не могу помочь. Обратись за помощью к системным администраторам на фриланс: weblancer.net или fl.ru . За небольшую плату, специалисты разберутся что вызывает данную ошибку и либо исправят, либо расскажут что нужно сделать для её исправления.

  • Здравствуйте, у мя такая ошибка на сайте mysql server has gone away,как решить?

  • Виталий приветствую!
    У меня не получается вывести таблицу в open server в консоли open servera.
    К базе подключаюсь в консоли в общем все этапы прохождения до момента вывода таблицы
    SELECT * FROM здесь название таблицы; Дальше выводит ошибку 2006.
    Винда 10, open server запускаю от имени администратора. Во всех файлах MySQL - x.x_my.ini в папке userdata / config я поменял значения в max_allowed_packet на 128М и wait_timeout=28800.
    Я новичек в данной сфере интереса много но вот никак не получается решить данную задачу чтобы все работало как часики. Да настройки в open server apache-2.4 , PHP-5.5 , MySQL 5.5. Сам open server свежий
    Очень очень буду благодарен за подробный ответ и да на winde 8.1 проблема та же.
    Заранее огромное спасибо!

  • Ни как ни магу решить проблему не помножите что только не делал 50 процентов сторонниц выдает Ошибок MySQL!
    ------------------------

    Возвращена ошибка:
    сервер MySQL ушел

    номер ошибки:
    2006

    • Не ясно что ты делаешь и как, но могу предположить что нужно установить опцию max_allowed_packet, как указано в статье. 50% страниц падает, из-за того, что при генерации этих страниц, запросы к бд, используют текстовые или иные поля, размер которых превышает max_allowed_packet

  • Привет Виталий!!
    Есть проблема в работе в консоли в Open Server.
    Не получается вывести таблицу в консоли с базы данных.
    Выдает ошибку Error 2006 (HY000)
    Open Server запускаю с администратора, во всех файлах конфигурации начиная с MySQL 5.1 в папке OpenServer\userdata\config я изменил значение
    max_allowed_packet = 128M
    wait_timeout=28800
    Open Server свежий на винде 10 и 8.1 такая проблема. Я в стопоре, если не сложно подскажи как сделать работу в консоли Open Servera стабильной. Нигде не могу найти более подробную информацию, так как я новичек в MySQL.
    Очень буду благодарен!!!

    • Привет,
      1) убедись что установленные тобой значения, используются в MySQL:

      SHOW VARIABLES LIKE 'max_allowed_packet';
      SHOW VARIABLES LIKE 'wait_timeout';

      2) попробуй ограничить запрос:

      SELECT * FROM table LIMIT 1

  • Хорошая статья, спасибо.

    Только вот если база данных больше 1гб, лимит max_allowed_packet = M предел гигабайт. Как быть?

    • Привет, да все верно, сейчас лимит 1GB. Но max_allowed_packet, устанавливает лимит не на базу и даже не на таблицу, это максимальный размер значения 1го поля (т.е. если представлять таблицу, то это максимальное значение которое можно записать в конкретную ячейку, при этом кол-во таких ячеек не ограничивается). Если стоит задача, хранить в базе сущности, минимальный размер которых свыше 1Гб (например, решил записать бинарные данные файла фильма в базу), то такие данные лучше хранить в виде отдельных файлов на диске, а в базу сохранять только имя файла. Думаю, немного прояснил вопрос :)