Mysql ошибка 2006

Ошибка 2006 под названием MySQL Sever has gone away означает отказ сервера в соединении даже при условии, что он запущен. Известно всего три причины, почему ошибка появляется. Первая причина – сервер

Ошибка 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

Дальше надо удалить хранилище (volume) с некорректно проинициализированной базой. Но в начале просмотрите список всех хранилищ:

$ docker volume ls

СЕРВЕР НЕВЕРНО ПРОИНИЦИАЛИЗИРОВАН

После удаляем:

$ docker volume rm имя_хранилища

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

Эта ошибка означает, что 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, интересуюсь всем, что связано с информационными технологиями и современной наукой.

Содержание

  1. Ошибка 2006: MySQL server has gone away
  2. Как исправить MySQL server has gone away
  3. 1. Истекло время ожидания
  4. 2. Слишком большой пакет
  5. 3. Сервер неверно проинициализирован
  6. Выводы
  7. Частые вопросы
  8. Ошибки базы данных
  9. MySQL Server Has Gone Away — как пофиксить
  10. Таймаут соединения
  11. Большой или некорректный пакет
  12. Самое главное

Ошибка 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
  • Не отвечает сервер при сохранении данных формы под MSSQL
  • При переносе на другой хостинг: «#1064 — You have an error in your SQL syntax. ‘DEFAULT CHARSET=. «
  • При установке на Oracle выдает следующую ошибку: ORA-01704: string literal too long
  • Неправильно сортируются элементы в списках
  • Server shutdown in progress
  • Out of range value adjusted for column ‘USER_ID’ или Incorrect integer value: » for column ‘SESS_SESSION_ID’
  • Access denied for user: ‘ user @%’ to database ‘dab_test’
  • DB query error. Please try later
  • Out of memory; restart server and try again (needed XXXXX bytes)
  • Got error 28 from table handler
  • Ошибки БД: «Incorrect key file», «Can’t open file», «Incorrect information in file» и др.

    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
    max_allowed_packet = 8M
    table_cache = 256
    sort_buffer_size = 8M
    read_buffer_size = 1M

    Если какие-то из рекомендуемых значений меньше установленных сейчас, оставьте эти значения прежними.

    Наверх

    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

    Затем установить тайм-аут ожидания:
    wait_timeout = 600

    Время ожидания в секундах, можно установить вплоть до 28800 с (8 часов)

    Не забудьте перезагрузить базу:
    sudo /etc/init.d/mysql restart

    Перезагрузка базы данных MySQL

    Иногда, при выполнении длительных запланированных задач, также может появиться ошибка MySQL Server Has Gone Away все из-за того же таймаута соединения. При этом лимит времени не получится существенно увеличить (максимум до нескольких часов), так как это может привести к заполнению буфера ожидающими соединениями.

    Поэтому лучше проверить соединение и, при необходимости, переподключиться.

    Подключение БД и переподключение при необходимости

    Большой или некорректный пакет

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

    Увеличение лимита размера входящего пакета, в МБ

    Также не забудьте перезагрузить базу данных.

    Самое главное

    После того, как устраните ошибку MySQL Server Has Gone Away, поиграйтесь с параметрами wait_timeout и max_allowed_packet для получения оптимальных лимитов.

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

    Источник

    Adblock
    detector

  • This article provides the solution to the following MySQL error:

    ERROR 2006 (HY000): MySQL server has gone away

    We generally get this kind of error when we try to import or insert a large volume of data into the MySQL database.

    To solve this error, we can:

    – either update the MySQL’s configuration file: my.cnf
    – or, update the global variables directly by logging into the MySQL server

    Update my.cnf file

    • Open terminal
    • Find the my.cnf file by running the following command:
    
    mysql --help | grep my.cnf
    
    • This should output something like this:
    
    order of preference, my.cnf, $MYSQL_TCP_PORT,
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
    
    • Open your my.cnf file in any editor and add/update the value of the following variables:
    
    [mysqld]
    max_allowed_packet= 1024M
    
    • In your my.cnf file, you may also try increasing the wait_timeout value:
    
    [mysqld]
    max_allowed_packet= 1024M
    wait_timeout= 60000
    
    • Restart MySQL server

    LINUX

    
    sudo /etc/init.d/mysqld restart
    
    //OR
    sudo service mysqld restart
    
    //OR
    sudo service mysql restart
    

    MACOS

    
    sudo /usr/local/mysql/support-files/mysql.server restart
    

    Now, you should be able to work fine with large MySQL datasets.

    Update the global variables directly by logging into the MySQL server

    First of all, you need to restart the MySQL server. You can run the commands listed above to restart the MySQL server.

    After that, you can check the list of all the MySQL Global Variables and their values with the following command:

    
    $> mysqladmin variables -u YourMysqlUsername -p
    

    You can also check for these variables value by first logging into MySQL server:

    
    $> mysql -u YourMysqlUsername -p
    
    mysql> SHOW VARIABLES;
    

    To check specific variable value:

    
    mysql> SHOW VARIABLES LIKE 'max_allowed_packet';
    

    To solve MySQL Server Gone Away error, you need to increase the value of max_allowed_packet variable. To do so, you have to run the following command:

    
    mysql> SET GLOBAL max_allowed_packet=1072731894;
    

    After that, quit MySQL login:

    
    mysql> quit
    

    Now, when you again login to MySQL and check for the max_allowed_packet value, you should see the updated value.

    
    $> mysql -u YourMysqlUsername -p
    
    mysql> SHOW VARIABLES LIKE 'max_allowed_packet';
    +--------------------+------------+
    | Variable_name      | Value      |
    +--------------------+------------+
    | max_allowed_packet | 1072731136 |
    +--------------------+------------+
    1 row in set (0.00 sec)
    

    Now, you should be able to work fine with large MySQL datasets.

    Hope this helps. Thanks.

    Понравилась статья? Поделить с друзьями:
  • Mysql ошибка 1241
  • Mysql ошибка 1146 как исправить
  • Mysql ошибка 1044
  • Mysql не удалось запустить службу ошибка 1067
  • Mysql код ошибки 1064