Писал регистрацию с урока, MySQL R39 плагин инклуд стоит тоже R39
Denwer запущен в БД прописано всё так же как и павно, вот сам код
#include <a_samp> #include <a_mysql> #include <foreach> #include <dc_cmd> #include <Pawn.Regex> #include <sscanf2> #include <streamer> //============================================================================== #define MYSQL_HOST "localhost" #define MYSQL_USER "root" #define MYSQL_DATABASE "new" #define MYSQL_PASSWORD "" #define IsPlayerAuthorized(%0) player_is_authorized{%0} #define SetPlayerAuthorized(%0,%1) player_is_authorized{%0} = %1 #define PLAYER_OFFLINE 0 #define PLAYER_ONLINE 1 //============================================================================== enum e_DIALOG_IDs { dKickMessage, REG, LOG }; enum e_PLAYER_INFO { pID, pName[MAX_PLAYER_NAME], pPassword[24] }; new player_is_authorized[MAX_PLAYERS char]; new mysql_connect_ID; new pInfo[MAX_PLAYERS][e_PLAYER_INFO]; //============================================================================== main() { print("n----------------------------------"); print("--------SERVER ACCEPT------"); print("----------ACCEPT-----------"); print("----------------------------------n"); } //============================================================================== public OnGameModeInit() { EnableStuntBonusForAll(0); //============================================================================== SetGameModeText("B 0.1"); //============================================================================== mysql_connect_ID = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD); mysql_query(mysql_connect_ID, "SET character_set_client = 'cp1251'", false); mysql_query(mysql_connect_ID, "SET character_set_results = 'cp1251'", false); mysql_query(mysql_connect_ID, "SET SESSION character_set_server='utf8'", false); switch(mysql_errno()) { case 0: print("ПОДКЛЮЧЕНИЕ К MYSQL УСЕШНО"); case 1044: print("Подключение к базе данных не удалось [Указано неизвестное имя пользователя]"); case 1045: print("Подключение к базе данных не удалось [Указан неизвестный пароль]"); case 1049: print("Подключение к базе данных не удалось [Указана неизвестная база данных]"); case 2003: print("Подключение к базе данных не удалось [Хостинг с базой данных не доступен]"); case 2005: print("Подключение к базе данных не удалось [Указан неизвестный адрес хостинга]"); default: printf("Подключение к базе данных не удалось [Неизвестная ошибка. Код ошибки: %d]", mysql_errno()); } //============================================================================== AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); //============================================================================== return 1; } public OnGameModeExit() { mysql_close(mysql_connect_ID); return 1; } public OnPlayerRequestClass(playerid, classid) { return 1; } public OnPlayerConnect(playerid) { GetPlayerName(playerid, pInfo[playerid][pName], MAX_PLAYER_NAME); new query_string[49+MAX_PLAYER_NAME-4]; format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]); mysql_function_query(mysql_connect_ID, query_string, true, "FindPlayerInTable","i", playerid); return 1; } public OnPlayerDisconnect(playerid, reason) { RemovePlayerInfo(playerid); SaveAccount(playerid); return 1; } public OnPlayerSpawn(playerid) { return 1; } public OnPlayerDeath(playerid, killerid, reason) { return 1; } public OnVehicleSpawn(vehicleid) { return 1; } public OnVehicleDeath(vehicleid, killerid) { return 1; } public OnPlayerText(playerid, text[]) { if(!IsPlayerAuthorized(playerid)) { SendClientMessage(playerid, -1, "Вы не авторизовались, вам запрещено писать в чат!"); return 0; } return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { if(!IsPlayerAuthorized(playerid)) return SendClientMessage(playerid, -1, "Вы не авторизировались и не можете использовать команды!"); return 0; } public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) { return 1; } public OnPlayerExitVehicle(playerid, vehicleid) { return 1; } public OnPlayerStateChange(playerid, newstate, oldstate) { return 1; } public OnPlayerEnterCheckpoint(playerid) { return 1; } public OnPlayerLeaveCheckpoint(playerid) { return 1; } public OnPlayerEnterRaceCheckpoint(playerid) { return 1; } public OnPlayerLeaveRaceCheckpoint(playerid) { return 1; } public OnRconCommand(cmd[]) { return 1; } public OnPlayerRequestSpawn(playerid) { return 1; } public OnObjectMoved(objectid) { return 1; } public OnPlayerObjectMoved(playerid, objectid) { return 1; } public OnPlayerPickUpPickup(playerid, pickupid) { return 1; } public OnVehicleMod(playerid, vehicleid, componentid) { return 1; } public OnVehiclePaintjob(playerid, vehicleid, paintjobid) { return 1; } public OnVehicleRespray(playerid, vehicleid, color1, color2) { return 1; } public OnPlayerSelectedMenuRow(playerid, row) { return 1; } public OnPlayerExitedMenu(playerid) { return 1; } public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) { return 1; } public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { return 1; } public OnRconLoginAttempt(ip[], password[], success) { return 1; } public OnPlayerUpdate(playerid) { return 1; } public OnPlayerStreamIn(playerid, forplayerid) { return 1; } public OnPlayerStreamOut(playerid, forplayerid) { return 1; } public OnVehicleStreamIn(vehicleid, forplayerid) { return 1; } public OnVehicleStreamOut(vehicleid, forplayerid) { return 1; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { case REG: { if(!response) { ShowPlayerDialog(playerid, dKickMessage, DIALOG_STYLE_MSGBOX, "[ОПОВЕЩЕНИЕ]", "{FFFFFFВы были кикнуты с сервера.n{FF0000}Причина: Отказ от регестрации.n{FFFFFF}Для выхода с сервера введите "/q" в чат", "Выход", ""); return Kick(playerid); } if(!strlen(inputtext)) return ShowPlayerDialog(playerid, REG, DIALOG_STYLE_INPUT, "Создание персонажа", "{FF0000}Ошибка: {FFFFFF}Вы не можете продолжить создание персонажа не введя пароль!nВведите пароль для продолжение создание персонажа:n{C0C0C0}ПРИМЕЧАНИЕ:n{666666}- Пароль должен содержать от 4 до 24 символовn- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход"); else if(strlen(inputtext) < 4) return ShowPlayerDialog(playerid, REG, DIALOG_STYLE_INPUT, "Создание персонажа", "{FF0000}Ошибка: {FFFFFF}Пароль слишком короткий!nВведите пароль для регистрации нового аккаунта:n{C0C0C0}Примечание:n{666666} - Пароль должен содержать от 4 до 30 символов.n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход"); else if(strlen(inputtext) > 24) return ShowPlayerDialog(playerid, REG, DIALOG_STYLE_INPUT, "Создание персонажа", "{FF0000}Ошибка: {FFFFFF}Пароль слишком длинный!nВведите пароль для регистрации нового аккаунта:n{C0C0C0}Примечание:n{666666} - Пароль должен содержать от 4 до 30 символов.n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход"); for(new i = strlen(inputtext)-1; i != -1; i--) { switch(inputtext[i]) { case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue; default: return ShowPlayerDialog(playerid, REG, DIALOG_STYLE_INPUT, "Создание персонажа", "{FF0000}Ошибка: {FFFFFF}Пароль содержит запрещённые символы!nВведите пароль для регистрации нового аккаунта:n{C0C0C0}Примечание:n{666666) - Пароль должен содержать от 4 до 30 символов.n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход"); } } pInfo[playerid][pPassword][0] = EOS; strins(pInfo[playerid][pPassword], inputtext, 0); CreateNewAccount(playerid, pInfo[playerid][pPassword]); return 1; } case LOG: { if(!response) { ShowPlayerDialog(playerid, dKickMessage, DIALOG_STYLE_MSGBOX, "[ОПОВЕЩЕНИЕ]", "{FF0000}Вы были кикнуты с сервера: {FFFFFF}ичина: Отказ от авторизации.n{FFFFFF}Для выхода с сервера введите "/q" в чат", "Выход", ""); return Kick(playerid); } if(!strlen(inputtext)) return ShowPlayerDialog(playerid, LOG, DIALOG_STYLE_INPUT, "Вход", "{FF0000}Ошибка: {FFFFFF}Вы не можете продолжить авторизацию не введя пароль!nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); for(new i = strlen(inputtext)-1; i != -1; i--) { switch(inputtext[i]) { case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue; default: return ShowPlayerDialog(playerid, LOG, DIALOG_STYLE_INPUT, "Вход", "{FF0000}Ошибка: {FFFFFF}Введённый пароль содержит запрещённые символы!nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); } } if(!strcmp(pInfo[playerid][pPassword], inputtext)) { new query_string[49+MAX_PLAYER_NAME]; format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]); mysql_function_query(mysql_connect_ID, query_string, true, "UploadPlayerAccount","i", playerid); } else { switch(GetPVarInt(playerid, "WrongPassword")) { case 0: ShowPlayerDialog(playerid, LOG, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 3 попытки.nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); case 1: ShowPlayerDialog(playerid, LOG, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 2 попытки.nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); case 2: ShowPlayerDialog(playerid, LOG, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 1 попытки.nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); case 3: ShowPlayerDialog(playerid, LOG, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталась последняя попытка, после чего Вас кикнет.nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход"); default: { ShowPlayerDialog(playerid, dKickMessage, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFFF}Вы были кикнуты с сервера.n{FF0000}Причина: Превышен лимит попыток на ввод пароля.n{FFFFFF}Для выхода с сервера введите "/q" в чат", "Выход", ""); return Kick(playerid); } } SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")+1); } return 1; } } return 1; } public OnPlayerClickPlayer(playerid, clickedplayerid, source) { return 1; } stock CreateNewAccount(playerid, password[]) { new query_string[66+MAX_PLAYER_NAME-4+30]; format(query_string, sizeof(query_string), "INSERT INTO `accounts` (`player_name`, `password`) VALUES ('%s', '%s')", pInfo[playerid][pName], password); mysql_function_query(mysql_connect_ID, query_string, true, "UploadPlayerAccountNumber", "i", playerid); format(query_string, sizeof(query_string), "Персонаж %s успешно создан. Администрация желает Вам приятной игры!", pInfo[playerid][pName]); SendClientMessage(playerid, 0xFFFFFF00, query_string); SetPlayerAuthorized(playerid, PLAYER_ONLINE); SpawnPlayer(playerid); return 1; } stock SaveAccount(playerid) { new query_string[(21)+(16+11)+(20+MAX_PLAYER_NAME)+(16+30)] = "UPDATE `accounts` SET"; format(query_string, sizeof(query_string), "%s `player_name` = '%s',", query_string, pInfo[playerid][pName]); format(query_string, sizeof(query_string), "%s `password` = '%s'", query_string, pInfo[playerid][pPassword]); format(query_string, sizeof(query_string), "%s WHERE `id` = '%d'", query_string, pInfo[playerid][pID]); mysql_function_query(mysql_connect_ID, query_string, false, "", ""); RemovePlayerInfo(playerid); return 1; } forward UploadPlayerAccountNumber(playerid); public UploadPlayerAccountNumber(playerid) pInfo[playerid][pID] = cache_insert_id(mysql_connect_ID); forward UploadPlayerAccount(playerid); public UploadPlayerAccount(playerid) { pInfo[playerid][pID] = cache_get_field_content_int(0, "id", mysql_connect_ID); SendClientMessage(playerid, 0xFFFFFF00, "Вы успешно авторизировались!"); SetPlayerAuthorized(playerid, PLAYER_ONLINE); SpawnPlayer(playerid); return 1; } stock RemovePlayerInfo(playerid) { pInfo[playerid][pID] = 0; pInfo[playerid][pName][0] = EOS; pInfo[playerid][pPassword][0] = EOS; return 1; }
И сам лог ошибки
[15:22:16] [ERROR] CMySQLQuery::Execute - (error #2006) MySQL server has gone away [15:22:16] [ERROR] CMySQLQuery::Execute - (error #2006) MySQL server has gone away [15:22:16] [ERROR] CMySQLQuery::Execute - (error #2006) MySQL server has gone away [15:22:17] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on 'localhost' (10061) [15:22:17] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on 'localhost' (10061)
Неполадки с базой данных
При работе с базами данных могут встречаться ошибки. Ниже перечислены частые ошибки и меры по их диагностике и устранению.
Недоступность базы данных
Необходимо подключиться к серверу по SSH и выполнить следующие проверки:
1. Проверить, запущена ли служба MySQL:
Пример вывода для запущенной службы:
Если в выводе отсутствует слово running, служба не запущена. В этом случае необходимо попытаться ее запустить:
После этого надо проверить работу сайта и сделать следующую проверку, если ошибка сохраняется.
2. Проверить состояние дискового пространства.
Просмотреть общий и занятый объем на диске командой:
Доступное пространство должно быть на основном разделе. Если свободное пространство закончилось, необходимо освободить место или перейти на тариф выше. Для работы с дисковым пространством можно использовать утилиты Ncdu или Du.
Если на диске достаточно свободного места, но ошибка сохраняется, надо проверить состояние Inodes.
Если не удается решить ошибку самостоятельно, то нужно обратиться в техническую поддержку.
Повреждены таблицы БД (Table is marked as crashed)
Если на сервере установлен PhpMyAdmin, можно выполнить восстановление с его помощью. Для этого необходимо:
Без phpMyAdmin можно выполнить необходимые действия при подключении по SSH. Для восстановления одной таблицы нужно выполнить команду:
Для восстановления всех таблиц в базе используется команда:
Также можно выполнить проверку всех таблиц в базе с помощью команды:
Ошибка 2006: MySQL server has gone away
Ошибка MySQL server has gone away означает, что сервер закрыл соединение. Это происходит, как правило, в двух случаях: превышение таймаута ожидания или получение сервером слишком большого пакета.
В обоих случаях для устранения ошибки потребуется внести правки в конфигурационный файл MySQL. Это делается при подключении к серверу по SSH или с помощью веб-консоли в панели управления.
Конфигурационный файл может располагаться по различным путям, например:
Чтобы определить, в какой файл необходимо вносить изменения, можно использовать команду вида:
С ее помощью можно выяснить, в каких файлах прописан нужный параметр, и изменить в них его значение.
Чтобы увеличить таймаут ожидания, необходимо скорректировать значение параметра Wait_timeout
Нужно открыть конфигурационный файл с помощью редактора, обязательно указав корректный путь к файлу:
Далее нужно изменить значение параметра wait_timeout на более высокое. Значение указывается в секундах: чтобы увеличить время ожидания до 10 минут, необходимо указать значение 600:
После перезапустить службу MySQL:
Скорректировать максимально допустимый размер пакетов можно увеличением параметра Max_allowed_packet.
Нужно открыть конфигурационный файл с помощью редактора, обязательно указав корректный путь к файлу:
Дале нужно изменить значение параметра max_allowed_packet на более высокое (значение указывается в мегабайтах):
После перезапустить службу MySQL:
Ошибка 1040: Too many connections
Ошибка «Too many connections» означает, что исчерпан лимит подключений к базе данных. Ошибка связана с медленными запросами, которые выполняются слишком долго (в этом случае требуется оптимизация кода) либо в числе одновременных подключений. В этом случае можно попробовать решить проблему увеличением лимита подключений (параметр max_connections) в конфигурационном файле MySQL.
В пункте выше было описано, как определить расположение файла my. cnf.
Следует открыть конфигурационный файл с помощью редактора, обязательно указав корректный путь к файлу:
И заменить значение параметра на более высокое, например:
Max_connections = 200
После перезапустить службу MySQL:
Ошибка 1292: Incorrect date value
При попытке добавить данные в таблицу MySQL без указания даты может выдаваться ошибка:
Ошибка 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. Это время в секундах, на протяжении которого надо ждать ответа от сервера.
Внося изменения, не забываем дальше перезагрузить сервер:
$ sudo systemctl restart mariadb
Слишком большой пакет
Когда клиент пользователя создает слишком большое количество пакетов, сервер выдаст именно эту ошибку. Доступный размер пакета (максимальное значение) можно увеличить с помощью параметра max_allowed_packet.
$ sudo vi /etc/mysql/my. cnf
Max_allowed_packet=128M
Отдельно обратите внимание на клиент, ведь если он посылает много запросов, то вы явно что-то делает не так. Как минимум не стоит генерировать запросы к MySQL с помощью циклов for.
Сервер неверно проинициализирован
Если вы решите развернуть MySQL или MariaDB в Docker, то будьте готовы столкнуться с подобной ошибкой. Первоначальная инициализация контейнера требует чуть больше свободного времени. Если не дать контейнеру завершить инициализацию, сперва остановив его и запустив, то база данных будет всегда возвращать такую ошибку. Решение – нужно полностью удалить данные контейнера с базой данных.
Дальше надо удалить хранилище (volume) с некорректно проинициализированной базой. Но в начале просмотрите список всех хранилищ:
$ docker volume rm имя_хранилища
Теперь можете запустить инициализацию приложения, только дождитесь, пока сервер баз данных сообщит, что он готов, и вы сможете к нему подключиться.
Источники:
Https://help. sweb. ru/entry/989/
Https://pq. hosting/help/instructions/Oshibka-2006:-MySQL-Server-has-gone-away
Доброго времени суток. Подскажите пожалуйста что это за ошибка — #2006 Невозможно подключиться к серверу MySQL. Выходит она при входе через phpmyadmin, после того как ввиду логин и пароль. Сервер установлен локально. Ошибку эту начало выдавать после того как я импортировал в WP xml файл который прилагался к шаблону ( демо контент ). В этих делах просто я новичок-любитель, просто появился интерес как это исправить. Заранее благодарен!!!
задан 30 дек 2013 в 6:23
Логин/пароль сверьте или смените.
если linux, то попробуйте
cat /root/.my.cnf
Там может лежать пароль к пользователю root.
![]()
ответ дан 6 янв 2014 в 6:29
Эта ошибка означает, что 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
Автор:
| Рейтинг: 5/5 |
Теги:
Эта статья может быть полезна тем, кто импортирует базы данных больших размеров на Denwer (либо на свой выделенный сервер). Допустим, размер Вашей базы 50 МБ. Просто через вставку запроса в phpMyAdmin в разделе «SQL» ничего не выйдет — браузер просто повиснет. Поэтому единственный выход — использовать импорт SQL-файла. Но тут Вас будет поджидать ошибка #2006 или server has gone away. Вот о решении этой проблемы я и расскажу в этой небольшой статье.
Самое первое, что Вы должны сделать — это настроить PHP для загрузки файлов больших размеров. Без этого по умолчанию Вы вообще не сможете загружать файлы размером, например, 50 МБ.
Дальше необходимо зайти в настройку MySQL (на Denwer это «usrlocalmysql-5.5my.ini«) и там поменять значение параметра «max_allowed_packet» на, например, 100M, что соответствует 100 МБ:
max_allowed_packet = 100M
После всего этого перезапустите MySQL (либо Denwer), и больше ошибки 2006 или server has gone away возникать не будет. Если, конечно, Вы не захотите импортировать базу данных размером 150 МБ, тогда придётся снова увеличивать необходимые параметры в настройках PHP и MySQL.
-
Создано 15.11.2013 11:49:18
-

Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так:

- Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
Следующее откроет пул соединений с базой данных mysql, и будет сообщено об ошибке:
_mysql_exceptions.OperationalError: (2006, ‘SSL connection error: SSL_CTX_set_tmp_dh failed’)
import MySQLdb
from MySQLdb.cursors import DictCursor
from DBUtils.PooledDB import PooledDB
# 1 база данных
db_3306 = {
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': 'macmysql',
'charset': 'utf8'
}
# 2 база данных
db_3307 = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': 'macmysql',
'charset': 'utf8'
}
class Mysql(object):
"""
Объект базы данных MYSQL, отвечающий за создание подключений к базе данных, подключения в этой категории реализуются с использованием пулов подключений
Получить объект подключения: conn = Mysql .__ getConn ()
Освободите объект подключения: conn.close () или del conn
"""
# Объект пула соединений
__pool = None
def __init__(self, db_name='', port=None):
"" "Конструктор базы данных, удалите соединение из пула соединений и сгенерируйте курсор операции" ""
if port == 3306:
db_config = db_3306
elif port == 3307:
db_config = db_3307
else:
поднять ("Нет такого порта")
self._conn = Mysql.__getConn(db=db_name, **db_config)
@staticmethod
def __getConn(**db_config):
"" "Статический метод, удалить соединение из пула соединений" ""
if Mysql.__pool is None:
__pool = PooledDB(creator=MySQLdb, mincached=1, maxcached=10,
blocking=True, maxusage=10000, **db_config)
print(__pool)
return __pool
def executeSql(self, command, param=None):
"" "Выполнить инструкцию sql, вернуть набор результатов для операции чтения" ""
try:
conn = self._conn.connection()
cursor = conn.cursor(cursorclass=DictCursor)
cursor.execute(command, param)
records = cursor.fetchall()
print(records)
return records
except:
raise
if __name__ == "__main__":
log_db = Mysql(db_name="log", port=3307)
command = "SELECT table_name as tab_name FROM information_schema.tables where table_schema ='log'"
try:
tables = log_db.executeSql(command=command)
except Exception as e:
print ('Сообщить об ошибке', e)
На поиск + тестирование ушло сутки:
Причина в том, что «host»: «127.0.0.1» просто замените «127.0.0.1» на «localhost».
Принцип не очень ясен. Если проходит великий бог, вы можете добавить его. Если вы найдете его позже, вы можете добавить его.
Справочные материалы:
https://my.oschina.net/zhouguanghu/blog/32422
Я получаю эту ошибку при попытке получить большой файл SQL (большой INSERTзапрос).
mysql> source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: *** NONE ***
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: *** NONE ***
Ничто в таблице не обновляется. Я попытался удалить и восстановить таблицу / базу данных, а также перезапустить MySQL. Ничто из этого не решает проблему.
Вот мой максимальный размер пакета:
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
Вот размер файла:
$ ls -s file.sql
79512 file.sql
Когда я попробую другой метод …
$ ./mysql -u root -p my_db < file.sql
Enter password:
ERROR 2006 (HY000) at line 1: MySQL server has gone away
Ответы:
max_allowed_packet=64M
Добавление этой строки в my.cnfфайл решает мою проблему.
Это полезно, когда столбцы имеют большие значения, которые вызывают проблемы, вы можете найти объяснение здесь .
В Windows этот файл находится по адресу: «C: ProgramData MySQL MySQL Server 5.6»
В Linux (Ubuntu): / etc / mysql
Глобальное обновление и настройки my.cnf у меня почему-то не сработали. Передача max_allowed_packetзначения непосредственно клиенту сработала здесь:
mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
В общем ошибка:
Ошибка: 2006 (
CR_SERVER_GONE_ERROR) — сервер MySQL ушел
означает, что клиент не может отправить вопрос на сервер .
mysql Импортировать
В вашем конкретном случае при импорте файла базы данных через mysql это, скорее всего, это означает, что некоторые запросы в файле SQL слишком велики для импорта и не могут быть выполнены на сервере, поэтому клиент отказывает при первой возникшей ошибке.
Итак, у вас есть следующие возможности:
-
Добавьте опцию force (
-f) дляmysqlпродолжения и выполнения остальных запросов.Это полезно, если в базе данных есть несколько больших запросов, связанных с кешем, которые в любом случае не актуальны.
-
Увеличьте
max_allowed_packetиwait_timeoutв конфигурации вашего сервера (например~/.my.cnf). -
Дамп базы данных, используя
--skip-extended-insertпараметр, чтобы разбить большие запросы. Затем импортируйте его снова. -
Попробуйте применить
--max-allowed-packetопцию дляmysql.
Общие причины
В целом эта ошибка может означать несколько вещей, таких как:
-
запрос к серверу неверный или слишком большой,
Решение: увеличить
max_allowed_packetпеременную .-
Убедитесь, что переменная находится в
[mysqld]разделе, а не[mysql]. -
Не бойтесь использовать большие числа для тестирования (как
1G). -
Не забудьте перезапустить сервер MySQL / MariaDB.
-
Дважды проверьте правильность установки значения:
mysql -sve "SELECT @@max_allowed_packet" # or: mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
-
-
Вы получили тайм-аут от соединения TCP / IP на стороне клиента.
Решение: увеличить
wait_timeoutпеременную . -
Вы попытались выполнить запрос после того, как соединение с сервером было закрыто.
Решение: Логическая ошибка в приложении должна быть исправлена.
-
Ошибка поиска имени хоста (например, проблема DNS-сервера) или сервер был запущен с
--skip-networkingпараметром.Другая возможность заключается в том, что ваш брандмауэр блокирует порт MySQL (например, 3306 по умолчанию).
-
Работающий поток был уничтожен, поэтому повторите попытку.
-
Вы столкнулись с ошибкой, когда сервер погиб при выполнении запроса.
-
Клиент, работающий на другом хосте, не имеет необходимых привилегий для подключения.
-
И многое другое, так что узнайте больше на: B.5.2.9 Сервер MySQL исчез .
Отладка
Вот несколько идей отладки на уровне экспертов:
-
Проверьте журналы, например
sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error") -
Проверьте соединение через
mysql,telnetили функцию звона (например ,mysql_pingв PHP). -
Используйте,
tcpdumpчтобы прослушать связь MySQL (не будет работать для сокетного соединения), например:sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings -
В Linux используйте
strace. На BSD / Mac использоватьdtrace/dtruss, напримерsudo dtruss -a -fn mysqld 2>&1Смотрите: Начало работы с DTracing MySQL
Узнайте больше, как отлаживать сервер или клиент MySQL по адресу: 26.5 Отладка и портирование MySQL .
Для справки, проверьте исходный код в sql-common/client.cфайле, ответственном за выдачу CR_SERVER_GONE_ERRORошибки для команды клиента.
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; }
На всякий случай, для проверки переменных вы можете использовать
$> mysqladmin variables -u user -p
Это отобразит текущие переменные, в данном случае max_allowed_packet, и, как кто-то сказал в другом ответе, вы можете временно установить его с помощью
mysql> SET GLOBAL max_allowed_packet=1072731894
В моем случае файл cnf не был принят во внимание, и я не знаю почему, поэтому код SET GLOBAL действительно помог.
Я исправил ошибку ERROR 2006 (HY000) at line 97: MySQL server has gone awayи успешно перенес файл sql> 5GB, выполнив эти два шага по порядку:
-
Создано /etc/my.cnf, как рекомендовали другие, со следующим содержанием:
[mysql] connect_timeout = 43200 max_allowed_packet = 2048M net_buffer_length = 512M debug-info = TRUE -
Присоединение флагов
--force --wait --reconnectк команде (т.е.mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect).
Важное примечание: необходимо было выполнить оба шага, потому что, если я не стал вносить изменения в файл /etc/my.cnf, а также добавлять эти флаги, некоторые из таблиц отсутствовали после импорта.
Используемая система: OSX El Capitan 10.11.5; mysql Ver 14.14 Distrib 5.5.51 для osx10.8 (i386)
У меня была та же проблема, но изменение max_allowed_packet в файле my.ini / my.cnf в [mysqld] помогло.
добавить строку
max_allowed_packet=500M
Теперь перезапустите службу MySQL, как только вы закончите.
Вы также можете войти в базу данных как root (или привилегию SUPER) и сделать
set global max_allowed_packet=64*1024*1024;
также не требует перезапуска MySQL. Обратите внимание, что вы должны исправить свой my.cnfфайл, как указано в других решениях:
[mysqld] max_allowed_packet=64M
И подтвердите изменение после перезапуска MySQL:
show variables like 'max_allowed_packet';
Вы также можете использовать командную строку, но это может потребовать обновления сценариев запуска / остановки, которые могут не выдержать обновления и исправления системы.
По запросу я добавляю свой собственный ответ здесь. Рад видеть, что это работает!
Решение заключается в увеличении значений, заданных параметрами wait_timeoutи connect_timeoutпараметрами в файле опций, под [mysqld]тегом.
Мне пришлось восстановить резервную копию MySQL на 400 МБ, и это сработало для меня (значения, которые я использовал ниже, немного преувеличены, но вы поняли):
[mysqld] port=3306 explicit_defaults_for_timestamp = TRUE connect_timeout = 1000000 net_write_timeout = 1000000 wait_timeout = 1000000 max_allowed_packet = 1024M interactive_timeout = 1000000 net_buffer_length = 200M net_read_timeout = 1000000 set GLOBAL delayed_insert_timeout=100000
Blockquote
Пара вещей может происходить здесь;
- Ваш
INSERTработает долго, а клиент отключается. При повторном подключении он не выбирает базу данных, поэтому возникает ошибка. Один из вариантов здесь — запустить ваш командный файл из командной строки и выбрать базу данных в аргументах, вот так;
$ mysql db_name <source.sql
- Другой способ — запустить вашу команду через
phpкакой-либо другой язык. После каждого долгосрочного оператора вы можете закрыть и снова открыть соединение, гарантируя, что вы подключены в начале каждого запроса.
Если вы работаете на Mac и устанавливаете mysql через brew, как я, сработало следующее.
cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf
Источник: Для доморощенных установок mysql, где my.cnf?
-
добавить
max_allowed_packet=1073741824к/usr/local/etc/my.cnf -
mysql.server restart
Я столкнулся с этой ошибкой, когда я использую Mysql Cluster, я не знаю, этот вопрос от использования кластера или нет. Так как ошибка точно такая же, дайте мое решение здесь. Получение этой ошибки, потому что узлы данных внезапно перестают работать. Но когда происходит сбой узлов, вы все равно можете получить правильный результат, используя cmd:
ndb_mgm -e 'ALL REPORT MEMORYUSAGE'
И mysqld тоже работает правильно. Так что сначала не могу понять, что не так. Примерно через 5 минут результат ndb_mgm показывает, что узел данных не работает. Тогда я осознаю проблему. Итак, попробуйте перезапустить все узлы данных, затем сервер MySQL вернулся и все в порядке.
Но одна вещь странна для меня, после того, как я потерял сервер MySQL для некоторых запросов, когда я использую cmd как show tables, я все еще могу получить информацию возврата как 33 rows in set (5.57 sec), но никакая информация таблицы не отображается.
Для amazon RDS (это мой случай) вы можете изменить max_allowed_packetзначение параметра на любое числовое значение в байтах, которое имеет смысл для самых больших данных в любой вставке, которую вы можете иметь (например: если у вас есть какие-то 50-мегабайтные значения в вашей вставке, установите max_allowed_packetдо 64M = 67108864), в новом или существующем parameter-group. Затем примените эту группу параметров к вашему экземпляру MySQL (может потребоваться перезагрузка экземпляра).
При повторном подключении и получении идентификатора подключения 2 сервер почти наверняка просто вышел из строя.
Обратитесь к администратору сервера и попросите их диагностировать проблему. Никакой не вредоносный SQL не может привести к сбою сервера, и вывод mysqldump определенно не должен.
Вероятно, это тот случай, когда администратор сервера допустил серьезную ошибку в работе, например, установил размер буфера, превышающий пределы адресного пространства архитектуры или превышающий емкость виртуальной памяти. Журнал ошибок MySQL, вероятно, будет содержать некоторую соответствующую информацию; они будут следить за этим, если они в любом случае компетентны.
Это более редкая проблема, но я видел это, если кто-то скопировал весь каталог / var / lib / mysql для переноса своей БД на другой сервер. Причина, по которой это не работает, заключается в том, что база данных работала и использовала файлы журналов. Иногда это не работает, если есть журналы в / var / log / mysql. Решением является также копирование файлов / var / log / mysql.
Для пользователей Drupal 8, которые ищут решение для сбоя импорта БД:
В конце файла дампа sql могут быть команды вставки данных в таблицу «webprofiler». Я полагаю, что какой-то файл журнала отладки не очень важен для работы сайта, поэтому все это можно удалить Я удалил все эти вставки, включая LOCK TABLES и UNLOCK TABLES (и все, что между ними). Это в самом низу файла sql. Проблема описана здесь:
https://www.drupal.org/project/devel/issues/2723437
Но кроме усечения этой таблицы нет другого решения.
Кстати, я попробовал все решения из ответов выше, и ничего больше не помогло.
Я перепробовал все вышеперечисленные решения, все не удалось.
Я закончил с использованием -h 127.0.0.1вместо использования по умолчанию var/run/mysqld/mysqld.sock.
Это сообщение об ошибке также появляется, когда вы создали SCHEMA с COLLATION, отличным от того, который используется в дампе. Итак, если дамп содержит
CREATE TABLE `mytab` ( .. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Вы должны также отразить это в сопоставлении SCHEMA:
CREATE SCHEMA myschema COLLATE utf8_unicode_ci;
Я использовал utf8mb4_general_ci в схеме, потому что мой скрипт пришел из новой установки V8, теперь загрузка БД на старом 5.7 потерпела крах и сводила меня с ума.
Так что, может быть, это поможет вам сэкономить немного разочаровывающих часов …
(MacOS 10.3, mysql 5.7)
Если ни один из этих ответов не решит проблему, я решил ее, удалив таблицы и автоматически создавая их таким образом:
when creating the backup, first backup structure and be sure of add: DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT CREATE PROCEDURE / FUNCTION / EVENT IF NOT EXISTS AUTO_INCREMENT
затем просто используйте эту резервную копию с вашей базой данных, и она будет удалять и воссоздавать нужные вам таблицы
Затем вы делаете резервные копии только данных, и делаете то же самое, и это будет работать.
Как насчет использования клиента MySQL, как это:
mysql -h <hostname> -u username -p <databasename> < file.sql
Я получаю эту ошибку, когда пытаюсь получить большой файл SQL (большой запрос INSERT).
mysql> source file.sql ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 2 Current database: *** NONE *** ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 3 Current database: *** NONE ***
В таблице ничего не обновляется. Я пробовал удалить и восстановить таблицу / базу данных, а также перезапустить MySQL. Ничто из этого не решает проблему.
Вот мой максимальный размер пакета:
+--------------------+---------+ | Variable_name | Value | +--------------------+---------+ | max_allowed_packet | 1048576 | +--------------------+---------+
Вот размер файла:
$ ls -s file.sql 79512 file.sql
Когда я пробую другой метод …
$ ./mysql -u root -p my_db < file.sql Enter password: ERROR 2006 (HY000) at line 1: MySQL server has gone away
24 ответа
Лучший ответ
max_allowed_packet=64M
Добавление этой строки в файл my.cnf решает мою проблему.
Это полезно, когда столбцы имеют большие значения, которые вызывают проблемы, вы можете найти объяснение здесь.
В Windows этот файл находится по адресу: «C: ProgramData MySQL MySQL Server 5.6».
В Linux (Ubuntu): / etc / mysql
631
Saty
15 Янв 2016 в 16:40
Глобальное обновление и настройки my.cnf у меня почему-то не работали. Здесь работала передача значения max_allowed_packet напрямую клиенту:
mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
70
Giacomo1968
29 Янв 2018 в 00:53
В общем ошибка:
Ошибка: 2006 (
CR_SERVER_GONE_ERROR) — сервер MySQL отключен
Означает, что клиент не смог отправить вопрос серверу .
mysql импорт
В вашем конкретном случае при импорте файла базы данных через mysql это, скорее всего, означает, что некоторые запросы в файле SQL слишком велики для импорта и не могут быть выполнены на сервере, поэтому клиент не работает на первая произошла ошибка.
Итак, у вас есть следующие возможности:
-
Добавьте параметр силы (
-f) дляmysql, чтобы продолжить и выполнить остальные запросы.Это полезно, если в базе данных есть несколько больших запросов, связанных с кешем, которые в любом случае не актуальны.
-
Увеличьте
max_allowed_packetиwait_timeoutв конфигурации вашего сервера (например,~/.my.cnf). -
Выгрузите базу данных, используя опцию
--skip-extended-insert, чтобы разбить большие запросы. Затем снова импортируйте его. -
Попробуйте применить параметр
--max-allowed-packetдляmysql.
Общие причины
Обычно эта ошибка может означать несколько вещей, например:
-
запрос к серверу неверный или слишком большой,
Решение: Увеличьте
max_allowed_packetпеременную .-
Убедитесь, что переменная находится в разделе
[mysqld], а не[mysql]. -
Не бойтесь использовать большие числа для тестирования (например,
1G). -
Не забудьте перезапустить сервер MySQL / MariaDB.
-
Дважды проверьте правильность установки значения:
mysql -sve "SELECT @@ max_allowed_packet" # или: mysql -sve "ПОКАЗАТЬ ПЕРЕМЕННЫЕ, КАК 'max_allowed_packet'"
-
-
Вы получили тайм-аут от соединения TCP / IP на стороне клиента.
Решение: Увеличьте переменную
wait_timeout. -
Вы пытались выполнить запрос после того, как соединение с сервером было закрыто.
Решение: необходимо исправить логическую ошибку в приложении.
-
Ошибка поиска имени хоста (например, проблема с DNS-сервером), или сервер был запущен с опцией
--skip-networking.Другая возможность заключается в том, что ваш брандмауэр блокирует порт MySQL (например, 3306 по умолчанию).
-
Выполняющийся поток был прерван, поэтому повторите попытку.
-
Вы столкнулись с ошибкой, из-за которой сервер умер при выполнении запроса.
-
Клиент, работающий на другом хосте, не имеет необходимых прав для подключения.
-
И многое другое, так что узнайте больше по адресу: B.5.2.9 MySQL сервер ушел.
Отладка
Вот несколько идей отладки на уровне экспертов:
-
Проверьте журналы, например
sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error") -
Проверьте свое соединение с помощью
mysql,telnetили функций ping (например,mysql_pingв PHP). -
Используйте
tcpdumpдля прослушивания сообщений MySQL (не будет работать для подключения через сокет), например:sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings -
В Linux используйте
strace. В BSD / Mac используйтеdtrace/dtruss, напримерsudo dtruss -a -fn mysqld 2>&1См .: Начало работы с DTracing MySQL
Узнайте больше о том, как отлаживать сервер или клиент MySQL, по адресу: 26.5 Отладка и перенос MySQL < / а>.
Для справки проверьте исходный код в sql-common/client.c, ответственный за выдачу ошибки CR_SERVER_GONE_ERROR для клиентской команды.
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;
}
41
kenorb
14 Дек 2017 в 22:11
Я решил ошибку ERROR 2006 (HY000) at line 97: MySQL server has gone away и успешно перенес файл sql размером> 5 ГБ, выполнив следующие два шага по порядку:
-
Создан /etc/my.cnf, как рекомендовали другие, со следующим содержимым:
[mysql] connect_timeout = 43200 max_allowed_packet = 2048M net_buffer_length = 512M debug-info = TRUE -
Добавление флагов
--force --wait --reconnectк команде (т. Е.mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect).
Важное примечание: необходимо было выполнить оба шага, потому что, если я не удосужился внести изменения в файл /etc/my.cnf, а также добавить эти флаги, некоторые таблицы отсутствовали после импорта.
Используемая система: OSX El Capitan 10.11.5; mysql Ver 14.14 Distrib 5.5.51 для osx10.8 (i386)
24
Giacomo1968
29 Янв 2018 в 00:52
На всякий случай для проверки переменных можно использовать
$> mysqladmin variables -u user -p
Это отобразит текущие переменные, в данном случае max_allowed_packet, и, как кто-то сказал в другом ответе, вы можете временно установить его с помощью
mysql> SET GLOBAL max_allowed_packet=1072731894
В моем случае файл cnf не был учтен, и я не знаю почему, поэтому код SET GLOBAL действительно помог.
20
lesolorzanov
3 Авг 2014 в 07:53
Вы также можете войти в базу данных как root (или с привилегиями SUPER) и сделать
set global max_allowed_packet=64*1024*1024;
Также не требует перезапуска MySQL. Обратите внимание, что вам следует исправить файл my.cnf, как указано в других решениях:
[mysqld]
max_allowed_packet=64M
И подтвердите изменение после перезапуска MySQL:
show variables like 'max_allowed_packet';
Вы также можете использовать командную строку, но для этого может потребоваться обновление сценариев запуска / остановки, которые могут не выдержать системных обновлений и исправлений.
В соответствии с просьбой, я добавляю сюда свой собственный ответ. Рад видеть, что он работает!
13
razzed
27 Май 2016 в 15:49
Решение заключается в увеличении значений параметров wait_timeout и connect_timeout в вашем файле параметров под тегом [mysqld].
Мне пришлось восстановить резервную копию mysql размером 400 МБ, и это сработало для меня (значения, которые я использовал ниже, немного преувеличены, но вы поняли):
[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE
connect_timeout = 1000000
net_write_timeout = 1000000
wait_timeout = 1000000
max_allowed_packet = 1024M
interactive_timeout = 1000000
net_buffer_length = 200M
net_read_timeout = 1000000
set GLOBAL delayed_insert_timeout=100000
Blockquote
11
Santosh Prasad
22 Май 2019 в 20:01
У меня была та же проблема, но изменение max_allowed_packet в файле my.ini / my.cnf в [mysqld] помогло.
Добавить строку
max_allowed_packet=500M
Теперь перезапустите службу MySQL, как только вы закончите.
10
Sathish D
18 Окт 2013 в 18:15
Здесь может происходить пара вещей;
- Ваш
INSERTработает долго, и клиент отключается. Когда он повторно подключается, он не выбирает базу данных, отсюда и ошибка. Один из вариантов здесь — запустить командный файл из командной строки и выбрать базу данных в аргументах, например:
$ mysql db_name
- Другой — запустить вашу команду через
phpили на другом языке. После каждого продолжительного оператора вы можете закрыть и снова открыть соединение, убедившись, что вы подключены в начале каждого запроса.
6
Chris Henry
7 Май 2012 в 03:13
Если вы используете Mac и установили mysql через brew, как я, сработало следующее.
cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf
Источник: Где my.cnf для установки homebrew?
-
добавить
max_allowed_packet=1073741824в/usr/local/etc/my.cnf -
mysql.server restart
5
Community
23 Май 2017 в 15:02
Я столкнулся с этой ошибкой, когда использую Mysql Cluster, я не знаю, что этот вопрос связан с использованием кластера или нет. Поскольку ошибка точно такая же, дайте мне решение здесь. Получение этой ошибки из-за внезапного сбоя узлов данных. Но когда узлы выходят из строя, вы все равно можете получить правильный результат с помощью cmd:
ndb_mgm -e 'ALL REPORT MEMORYUSAGE'
Да и mysqld тоже работает правильно. Так что сначала я не могу понять, что не так. И примерно через 5 минут результат ndb_mgm показывает, что узел данных не работает. Тогда я понимаю, в чем проблема. Итак, попробуйте перезапустить все узлы данных, тогда сервер mysql вернулся, и все в порядке.
Но одна вещь для меня странная: после того, как я потерял сервер mysql для некоторых запросов, когда я использую cmd, например show tables, я все еще могу получить информацию о возврате, например 33 rows in set (5.57 sec), но информация о таблице не отображается.
2
zhihong
29 Янв 2013 в 15:19
Это сообщение об ошибке также появляется, когда вы создали СХЕМУ с другим СОБРАНИЕМ, отличным от того, который используется в дампе. Итак, если дамп содержит
CREATE TABLE `mytab` (
..
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Вы также должны отразить это в сопоставлении SCHEMA:
CREATE SCHEMA myschema COLLATE utf8_unicode_ci;
Я использовал utf8mb4_general_ci в схеме, потому что мой скрипт был получен из новой установки V8, теперь загрузка БД на старой версии 5.7 вылетела, и я почти с ума сошел.
Так что, может быть, это поможет вам сэкономить утомительные часы …
(MacOS 10.3, mysql 5.7)
2
4braincells
19 Фев 2020 в 13:19
Если он повторно подключается и получает идентификатор соединения 2, сервер почти наверняка просто упал.
Свяжитесь с администратором сервера и попросите его диагностировать проблему. Никакой незлонамеренный SQL не должен приводить к сбою сервера, и вывод mysqldump определенно не должен.
Вероятно, администратор сервера допустил большую операционную ошибку, такую как присвоение размеров буфера больше, чем ограничения адресного пространства архитектуры, или больше, чем емкость виртуальной памяти. Журнал ошибок MySQL, вероятно, будет содержать некоторую важную информацию; они будут следить за этим, если они в любом случае компетентны.
1
MarkR
7 Май 2012 в 05:37
Для amazon RDS (это мой случай) вы можете изменить значение параметра max_allowed_packet на любое числовое значение в байтах, которое имеет смысл для самых больших данных в любой вставке, которая у вас может быть (например, если у вас есть значения blob размером 50 МБ в свою вставку, установите max_allowed_packet на 64M = 67108864) в новом или существующем parameter-group. Затем примените эту группу параметров к своему экземпляру MySQL (может потребоваться перезагрузка экземпляра).
1
SebaGra
26 Янв 2018 в 18:17
Для пользователей Drupal 8, которые ищут решение проблемы с импортом БД:
В конце файла дампа sql могут быть команды, вставляющие данные в таблицу «webprofiler». Это, я думаю, какой-то файл журнала отладки, и это не очень важно для работы сайта, поэтому все это можно удалить. Я удалил все эти вставки, включая LOCK TABLES и UNLOCK TABLES (и все, что между ними). Он находится в самом низу файла sql. Проблема описана здесь:
https://www.drupal.org/project/devel/issues/2723437
Но для этого нет решения, кроме усечения этой таблицы.
Кстати, я пробовал все решения из ответов выше, и больше ничего не помогло.
0
MilanG
27 Сен 2019 в 15:42
Я пробовал все вышеперечисленные решения, все не удалось.
В итоге я использовал -h 127.0.0.1 вместо стандартного var/run/mysqld/mysqld.sock.
0
osexp2003
27 Ноя 2019 в 13:17
Если вы пробовали все эти решения, особенно. увеличивая max_allowed_packet до максимального поддерживаемого количества 1GB, и вы все еще видите эти ошибки, возможно, вашему серверу буквально не хватает свободной оперативной памяти …
Решение = обновите ваш сервер до большего объема оперативной памяти и попробуйте еще раз.
Примечание: я удивлен, что это простое решение не было упомянуто после более чем 8-летнего обсуждения в этой ветке … иногда мы, разработчики, склонны слишком много обдумывать.
0
Jesse Nickles
7 Янв 2021 в 03:01
Если ни один из этих ответов не решает проблему, я решил ее, удалив таблицы и автоматически создав их следующим образом:
when creating the backup, first backup structure and be sure of add:
DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT
CREATE PROCEDURE / FUNCTION / EVENT
IF NOT EXISTS
AUTO_INCREMENT
Затем просто используйте эту резервную копию с вашим БД, и она удалит и воссоздает нужные вам таблицы.
Затем вы делаете резервную копию только данных и делаете то же самое, и все будет работать.
-1
Pathik Vejani
8 Июн 2016 в 08:10
Как насчет использования клиента mysql следующим образом:
mysql -h <hostname> -u username -p <databasename> < file.sql
-3
ErJab
7 Май 2012 в 03:11
У меня была такая же проблема с XAMMP
Метод-01: я изменил max_allowed_packet в файле D:xamppmysqlbinmy.ini следующим образом:
max_allowed_packet = 500 МБ
Наконец, перезапустите службу MySQL один раз и все готово.
Метод-02:
Более простой способ, если вы используете XAMPP. Откройте панель управления XAMPP и нажмите кнопку конфигурации в разделе mysql.

Теперь щелкните my.ini, и он откроется в редакторе. Обновите max_allowed_packet до необходимого размера.

Затем перезапустите службу mysql. Нажмите «Остановить» в сервисе Mysql, нажмите «Пуск» снова. Подождите несколько минут.

Затем попробуйте снова запустить запрос Mysql. Надеюсь, это сработает.
2
Haron
12 Июл 2021 в 20:23
Это более редкая проблема, но я видел это, если кто-то скопировал весь каталог / var / lib / mysql как способ переноса своей БД на другой сервер. Причина, по которой это не работает, заключается в том, что база данных работала и использовала файлы журнала. Иногда это не работает, если есть логи в / var / log / mysql. Решение состоит в том, чтобы скопировать также файлы / var / log / mysql.
1
Areeb Soo Yasir
16 Янв 2017 в 23:46
Добавить max_allowed_packet=64M в [mysqld]
[mysqld]
max_allowed_packet=64M
Перезагрузите сервер MySQL.
0
Hermann Schwarz
3 Дек 2021 в 11:11
Окончательным решением для меня было устранение ошибок, вызывающих предупреждения. Я также изменил max_allowed_packet, который помогал с меньшими файлами с ошибками. Устранение ошибок также невероятно ускорило процесс.
0
Basil Cabrera
6 Дек 2021 в 16:17
Эта ошибка означает, что 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 ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Об авторе
![]()
Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.
Доброго времени суток. Подскажите пожалуйста что это за ошибка — #2006 Невозможно подключиться к серверу MySQL. Выходит она при входе через phpmyadmin, после того как ввиду логин и пароль. Сервер установлен локально. Ошибку эту начало выдавать после того как я импортировал в WP xml файл который прилагался к шаблону ( демо контент ). В этих делах просто я новичок-любитель, просто появился интерес как это исправить. Заранее благодарен!!!
задан 30 дек 2013 в 6:23
Логин/пароль сверьте или смените.
если linux, то попробуйте
cat /root/.my.cnf
Там может лежать пароль к пользователю root.
![]()
ответ дан 6 янв 2014 в 6:29
Ошибка 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 имя_хранилища
Теперь можете запустить инициализацию приложения, только дождитесь, пока сервер баз данных сообщит, что он готов, и вы сможете к нему подключиться.
public OnGameModeInit()
{
SetGameModeText("LOADING...");
AddPlayerClass(0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
SetNameTagDrawDistance(15.0);
//dbHandle = mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
new bind[64];
GetServerVarAsString("bind", bind, sizeof(bind));
if(!strcmp(bind, "91.134.211.177", true))
{
dbHandle = mysql_connect(SQL_HOST_1, SQL_USER_1, SQL_DB_1, SQL_PASS_1);
SERVER_MODE = 1;
printf("GameMode ïîäêëþ÷åí ê ñåðâåðó ¹1");
}
else if(!strcmp(bind, "91.134.254.232", true))
{
dbHandle = mysql_connect(SQL_HOST_2, SQL_USER_2, SQL_DB_2, SQL_PASS_2);
SERVER_MODE = 2;
printf("GameMode ïîäêëþ÷åí ê ñåðâåðó ¹2");
}
else if(!strcmp(bind, "91.134.211.177", true))
{
dbHandle = mysql_connect(LOCAL_SQL_HOST, LOCAL_SQL_USER, LOCAL_SQL_DB, LOCAL_SQL_PASS);
SERVER_MODE = 3;
printf("GameMode ïîäêëþ÷åí ê ëîêàëüíîìó ñåðâåðó");
}
mysql_log(LOG_WARNING | LOG_ERROR);
mysql_function_query(dbHandle, "SET NAMES cp1251", false, "", "");
mysql_set_charset("cp1251");
