ПОМИЛКА 2006 (HY000): сервер MySQL пішов


309

Я отримую цю помилку, коли намагаюся створити великий файл 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

2
Наскільки це великий файл? Можливо, це перевищує налаштування max_allowed_packet?
Марк Б

1
Гаразд, це не все. Спробуйте витягнути окремі запити з файлу та запустити їх самостійно на моніторі. щось там викликає збій / відключення.
Марк Б

Запитання, які я випадковим чином витягую з файлу, добре працюють. Я генерував програму SQL програмно і встигав усе правильно. Тож я не впевнений, що може спричинити помилку, якщо така є.
bgcode

1
У мене теж є
така

Відповіді:


561
max_allowed_packet=64M

Додавання цього рядка до my.cnfфайлу вирішує мою проблему.

Це корисно, коли стовпці мають великі значення, що викликають проблеми, пояснення ви можете знайти тут .

У Windows цей файл знаходиться за адресою: "C: \ ProgramData \ MySQL \ MySQL Server 5.6"

У Linux (Ubuntu): / etc / mysql


3
це рішення вирішило заявлену проблему для мене; нічого не можна було зробити через конфігурацію / параметри лише на стороні клієнта, і я не бажав переходити на програмне рішення через PHP або інше.
Річард Сітце

154
Ви також можете увійти в базу даних як root (або привілей SUPER), і зробити це set global max_allowed_packet=64*1024*1024;- також не потрібно перезавантаження MySQL
зруйнований

3
Це зафіксувало це для мене. my.cnf може бути розміщений у папці / etc.
Сем Влобергс

8
Ви повинні мати можливість помістити це в командний рядок, що дозволить уникнути тимчасового редагування системного файлу: <code> mysql --max_allowed_packet = 1GM </code>
Ян Штейнман

6
Для всіх, хто шукає розташування файлу my.cnf, ви можете перевірити цю відповідь . Також не забудьте перезапустити mysql, ввівши: sudo service mysql restartщоб зміни у файлі my.cnf набули чинності.
Консуела

148

Ви можете збільшити Максимально дозволений пакет

SET GLOBAL max_allowed_packet=1073741824;

http://dev.mysql.com/doc/refman/5.5/uk/server-system-variables.html#sysvar_max_allowed_packet


3
Це працювало для мене, поки прийнятої відповіді не було. Я здогадуюсь, що вище значення цієї відповіді є коренем рішення для мене.
Іван Бубріскі

Я встановив max_allowed_packet = 1024М у my.cnf
Csaba Toth,

1
Це робить сервер. Вам потрібно це зробити і в клієнті, як-от "mysql --max_allowed_packet = 1073741824".
Ян Штейнман

Це працювало для мене. одне питання - "1073741824" у байтах
user2478236

66

Глобальне оновлення та налаштування my.cnf чомусь не працювали для мене. Передача max_allowed_packetзначення безпосередньо клієнту, який працював тут:

mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql

4
За даними веб-сайту MySQL, слід використовувати як марковану відповідь, так і цю.
Зенексер

2
Не забудьте перезавантажити конфігураційні файли або перезапустити сервер після зміни цих налаштувань
Csaba Toth,

2
Майте на увазі, використовуючи --max_allowed_packetлише впливає на клієнта. Подумайте також про зміну сервера mysql (mysqld), відредагувавши max_allowed_packetу /etc/my.cnfфайлі та перезапустивши ваш сервер mysql.
Fleuv

Зауважте, що людські цінності "50M" або "1G" працюють на кліпі та в my.cnf. dev.mysql.com/doc/refman/8.0/uk/using-system-variables.html
txyoji

36

Загалом помилка:

Помилка: 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;
}

--quick не працював для мене, але --skip-extension-insert зробив!
chiliNUT

20

Про всяк випадок, щоб перевірити змінні, які ви можете використовувати

$> mysqladmin variables -u user -p 

Це відобразить поточні змінні, у цьому випадку max_allowed_packet, і як хтось сказав у іншій відповіді, ви можете встановити його тимчасово за допомогою

mysql> SET GLOBAL max_allowed_packet=1072731894

У моєму випадку файл cnf не враховувався, і я не знаю чому, тому код SET GLOBAL дійсно допоміг.


Чудово, що можна побачити всі налаштування конфігурації за один раз. Дякую!
ДрБ

20

Я вирішив помилку ERROR 2006 (HY000) at line 97: MySQL server has gone awayта успішно перемістив файл> sql sql 5 Гб, виконавши ці два кроки для того, щоб:

  1. Створено /etc/my.cnf, як рекомендували інші, із наступним вмістом:

    [mysql]
    connect_timeout = 43200
    max_allowed_packet = 2048M
    net_buffer_length = 512M
    debug-info = TRUE
  2. Додавання прапорів --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)


2
Я отримую помилку навіть після дотримання всіх інструкцій.
Сантош Хегде

Для тих, хто працює з цією проблемою в спільному хості, не можна змінити конфігураційний файл, це рішення працює дуже добре.
Феліпе Коста

@SantoshHegde Це може бути занадто пізно, але після зміни my.cnf, вам потрібно перезапустити службу mysql.
Джейсон Лю

11

У мене була така ж проблема, але зміна max_allowed_packet у файлі my.ini / my.cnf в розділі [mysqld] зробила трюк.

додати рядок

max_allowed_packet=500M

тепер перезапустіть службу MySQL, як тільки ви закінчите.


@babonk так, але ця відповідь є більш корисною, оскільки під яким розділом сказано, що їй потрібно пройти
Jason Wheeler

11

Ви також можете увійти до бази даних як 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';

Ви також можете використовувати командний рядок, але це може потребувати оновлення скриптів запуску / зупинки, які можуть не пережити оновлення системи та виправлення.

Як вимагається, я тут додаю власну відповідь. Радий бачити, що це працює!


9

Рішення полягає у збільшенні значень 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

Блок-котирування


1
Чудово. Це допомагає мені отримати ще одну помилку, яку я можу вирішити :)
jrosell

6

Тут може відбуватися пара речей;

  • Ви INSERTпрацюєте довго, а клієнт відключається. При повторному підключенні він не вибирає базу даних, отже, помилка. Один з варіантів тут - запустити свій пакетний файл з командного рядка та вибрати базу даних в аргументах, як-от так;

$ mysql db_name <source.sql

  • Інша - запустити свою команду через phpбудь-яку іншу мову. Після кожного тривалого оператора ви можете закрити і повторно відкрити з'єднання, гарантуючи, що ви підключені на початку кожного запиту.

Ще одна річ, яку варто згадати - це те, що я отримую помилку майже відразу після sourceкоманди
bgcode

Якщо ви отримаєте помилку одразу після вихідної команди, то, ймовірно, MySQL щось не сподобається у запиті. Ви перевірили загальний журнал?
Кріс Генрі

Я повинен з'ясувати, як перевірити загальний журнал .. Я на MAMP, і я не впевнений, що він пише це за замовчуванням.
bgcode

Я вирішив просто вирішити його за допомогою запиту PHP і розрізати його.
bgcode


2

Я зіткнувся з цією помилкою, коли використовую кластер Mysql, я не знаю, це питання від використання кластера чи ні. Оскільки помилка абсолютно однакова, тож дайте тут своє рішення. Отримання цієї помилки, оскільки вузли даних раптово виходять з ладу. Але коли вузли виходять з ладу, ви все одно можете отримати правильний результат, використовуючи cmd:

ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

І mysqld також працює правильно. Отже, спочатку я не можу зрозуміти, що не так. Приблизно через 5 хвилин результат ndb_mgm показує, що вузол даних не працює. Тоді я усвідомлюю проблему. Отже, спробуйте перезапустити всі вузли даних, тоді сервер mysql повернувся і все гаразд.

Але одне дивно для мене, коли я втратив mysql-сервер для деяких запитів, коли я використовую cmd, як і раніше show tables, я можу отримати інформацію про повернення на кшталт 33 rows in set (5.57 sec), але інформація про таблицю не відображається.


1

Для amazon RDS (це мій випадок) ви можете змінити max_allowed_packetзначення параметра на будь-яке числове значення в байтах, що має сенс для найбільших даних у будь-якій вставці, яка може бути у вас (наприклад: якщо у вашій вставці є певні значення 50 Мб, встановіть значення max_allowed_packetдо 64М = 67108864), у новому чи існуючому parameter-group. Потім застосуйте цю групу параметрів до свого екземпляра MySQL (може знадобитися перезавантаження екземпляра).


Якщо ваша робота з Amazon RDS це працює. Ви не можете встановити глобальні значення в RDS так, як зазначено в SebaGra, якщо ви переходите та змінюєте власну групу параметрів БД, знайдіть max_allowed_packet parameterта встановіть його відповідного розміру (або якщо у вас дійсно великі краплі просто встановіть його на максимальне значення 1073741824 ) це має працювати.
G_Style

Ви отримували послідовний збій під час завантаження одного і того ж набору даних або повністю випадкового? питаю, тому що у мене є одне і те ж питання, але повністю випадкове, вийде з ладу 5 разів, а потім працювати над 5-м. Крім того, перехід на мою локальну машину та запуск з візуальної студії, здається, допомагають, але я все одно час від часу натрапляю на помилку.
BilliD

0

Якщо він знову під’єднується та отримує ідентифікатор з'єднання 2, сервер майже точно закінчився збоєм.

Зверніться до адміністратора сервера та отримайте їх для діагностики проблеми. Жоден нешкідливий SQL не повинен збивати сервер, а вихід mysqldump, безумовно, не повинен.

Ймовірно, випадок, що адміністратор сервера допустив велику операційну помилку, наприклад, присвоєння розмірів буфера, що перевищує обмеження адресного простору архітектури або більше, ніж ємність віртуальної пам'яті. Журнал помилок MySQL, ймовірно, матиме певну релевантну інформацію; вони будуть контролювати це, якщо вони все-таки компетентні.


0

Це більш рідкісна проблема, але я бачив це, якщо хтось скопіював весь каталог / var / lib / mysql як спосіб перенесення їх БД на інший сервер. Причина не працює в тому, що база даних працювала і використовувала файли журналів. Іноді це не працює, якщо в / var / log / mysql є журнали. Рішенням є також копіювання файлів / var / log / mysql.


0

Для користувачів Drupal 8, які шукають рішення для збою імпорту БД:

В кінці дамп-файлу sql є команди, що вставляють дані в таблицю "webprofiler". Мабуть, якийсь файл журналу налагодження не дуже важливий для роботи сайту, тому все це можна видалити. Я видалив усі ці вставки, включаючи ТАБЛИЦІ БЛОКУВАННЯ та НЕЗАДАЧІ ТАБЛИЦІ (і все між ними) Він знаходиться внизу файлу sql. Проблема описана тут:

https://www.drupal.org/project/devel/isissue/2723437

Але немає рішення, крім обрізання цієї таблиці.

До речі, я спробував усі рішення з відповідей вище, і нічого іншого не допомогло.


0

Я спробував усі вищезазначені рішення, все не вдалося.

Я в кінцевому підсумку використовував -h 127.0.0.1замість використання за замовчуванням var/run/mysqld/mysqld.sock.


0

Це повідомлення про помилку також виникає, коли ви створили СХЕМУ з іншою КОЛЛАЦІєю, ніж та, яка використовується на дамп. Отже, якщо дамп містить

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)


-1

якщо жоден із цих відповідей не вирішує проблему, я вирішив її, видаливши таблиці та створивши їх автоматично автоматично таким чином:

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

тоді просто використовуйте цю резервну копію з db, і вона видалить і відтворить потрібні вам таблиці.

Тоді ви створюєте резервну копію просто даних, і робите те саме, і це спрацює.


-3

Як щодо використання клієнта mysql таким чином:

mysql -h <hostname> -u username -p <databasename> < file.sql

Це звичайно не спрацює, якщо файл sql є занадто великим ... ось про що йдеться.
lesolorzanov
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.