MySQL Server відійшов під час імпорту великого файлу sql


259

Я намагався імпортувати великий файл sql через phpMyAdmin ... Але він постійно показував помилку

"Сервер MySql пішов"

Що робити?


3
Які ваші значення для max_allowed_packet та wait_timeout?
daemonofchaos

1
можна спробувати подвоїти max_allowed_packet. Трохи грубо, але якщо це спрацьовує, ви можете знайти здорове значення.
Нанна

1
Дякую за сміх Коулу Джонсону. Це було чудово! ЛОЛ! :)
mbrinson

Я бачу це часто, випадково. Але я не можу знову відтворити ту саму помилку. І, отже, зрозумів, що це може бути динамічно. Іноді, якщо клієнт надсилає занадто багато SQL на сервер (наприклад, з циклу), це може статися. Пошук фактичної причини цієї помилки є важливим. Перевірте також свої журнали запитів на повторення шаблонів SQL, щоб з’ясувати підказки.
Бімал Поудель

іноді ви отримуєте це, коли місця на вашому диску недостатньо
pramodtech

Відповіді:


376

Як зазначено тут :

Дві найпоширеніші причини (і виправлення) для сервера MySQL пішли (помилка 2006):

Сервер вичерпав та закрив з'єднання. Як виправити:

  1. переконайтеся, що змінна wait_timeout у файлі конфігурації my.cnf вашого mysqld є достатньо великою. У Debian: sudo nano /etc/mysql/my.cnfвстановіть wait_timeout = 600секунди (ви можете налаштувати / зменшити це значення, коли помилка 2006 не буде), потім sudo /etc/init.d/mysql restart. Я не перевіряв, але значення за замовчуванням для wait_timeout може становити близько 28800 секунд (8 годин).

  2. Сервер скинув неправильний або занадто великий пакет. Якщо mysqld отримує занадто великий або неправильний пакет, він припускає, що з клієнтом щось пішло не так і закриває з'єднання. Ви можете збільшити максимальний розмір пакету, збільшивши значення max_allowed_packet у файлі my.cnf. У Debian:, sudo nano /etc/mysql/my.cnfвстановіть max_allowed_packet = 64M(ви можете налаштувати / зменшити це значення, коли помилка 2006 року відсутня), потім sudo /etc/init.d/mysql restart.

Редагувати:

Зауважте, що файли опцій MySQL не мають своїх команд, уже доступних як коментарі (як, наприклад, у php.ini). Таким чином , ви повинні ввести який - або зміна / Твік в my.cnfабо my.iniі розмістити їх в mysql/dataкаталозі або в будь-якому з інших шляхів, при правильній групі опцій , таких як [client], [myslqd]і так далі Наприклад:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

Потім перезавантажте сервер. Щоб отримати їх значення, введіть у клієнт mysql:

> select @@wait_timeout;
> select @@max_allowed_packet;

72
У моєму випадку це була змінна max_allowed_packet . Він був встановлений за замовчуванням у 1 Мб (це ви можете побачити, запустивши SHOW VARIABLESзапит MySQL), і файл, який я імпортував, мав кілька дуже великих записів. Я відкрив файл my.ini (у мене працював Windows) і встановив значення для цього:, max_allowed_packet = 64Mперезапустив MySQL і повторно запустив імпорт.
Брент Матцелль

Я завантажував великі файли в базу даних за допомогою веб-тканин. Це допомогло, дякую ... :-)
inf3rno

@BrentMatzelle Це, безумовно, подбало про проблему "Mysql пішов". Дякую!
asprin

2
Я не можу знайти wait_timeoutлінію
Окі Ері Рінальді

4
у випадку Windows (з Xampp) це був файл my.ini, а innodb_lock_wait_timeout
Ананда,

98

Для мене це рішення не вийшло, тому я виконав

SET GLOBAL max_allowed_packet=1073741824;

в моєму SQL-клієнті.

Якщо ви не можете змінити це за допомогою запущеної служби MYSql, слід зупинити службу та змінити змінну у файлі "my.ini".

Наприклад:

max_allowed_packet=20M

1
Це працювало для мене на MAMP (OS X), коли інших, більш популярних відповідей, не було. Але чи це постійно?
atwixtor

2
@atwixtor ні, встановлення змінних, як це працює, до запуску сервера. а потім вони скидаються до значення за замовчуванням.
д.раєв

1
Це зробило трюк: на тестовій машині XAMPP в Windows мені довелося змінити як php.iniфайл (як запропонував @GBD у відповіді), так і конфігураційний файл MySQL, my.iniщоб він працював.
Грубер

2
Я б запропонував додати, що ви можете перевірити поточний розмір за допомогоюSHOW variables LIKE 'max_allowed_packet'
Arth

Це не є постійним , оскільки значення буде скинуто, коли сервер перезапуститься (зрештою), але це також не тільки для поточного сеансу. Встановлення max_allowed_packetодного клієнта та імпортування великого .sqlфайлу в інший сеанс буде добре.
VoteyDisciple

21

Якщо ви працюєте над XAMPP, ви можете виправити проблему MySQL Server, яка пішла з наступних змін.

відкрийте файл my.ini my.ini - це місце розташування (D: \ xampp \ mysql \ bin \ my.ini)

змінити наступні значення змінних

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

samp для wamp, max_allowed_packet = 64М
Андрій

19

Якщо ви працюєте зі значеннями за замовчуванням, то у вас є багато місця для оптимізації конфігурації mysql.

Перший крок, який я рекомендую, - це збільшити max_allowed_packet до 128М.

Потім скачайте скрипт настройки Tuning Primer MySQL і запустіть його. Він надасть рекомендації для декількох аспектів вашого конфігурації для кращої роботи.

Також погляньте на коригування значень тайм-ауту як у MySQL, так і в PHP.

Наскільки великий (розмір) файл, який ви імпортуєте, і чи можете ви імпортувати файл за допомогою клієнтського командного рядка mysql замість PHPMyAdmin?


Дякую, у мене вже було встановлено max_allowed_packet на 16М, потім я знайшов це питання і підняв його до 32М, думаючи, що його, безумовно, буде достатньо, але потім я побачив вашу відповідь і 128М напевно працює. Я вважаю, що весь оператор SQL у файлі * .sql трактується як лише один пакет?
Ілля Лінн

8

Якщо ви використовуєте MAMP в OS X, вам потрібно буде змінити max_allowed_packetзначення в шаблоні для MySQL.

  1. Ви можете знайти його за адресою: Файл> Редагувати шаблон> MySQL my.cnf

  2. Потім просто шукайте max_allowed_packet, змінюйте значення та зберігайте.


6

Я вирішив свою проблему цим коротким файлом /etc/mysql/my.cnf:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

1
підтверджено, що це також працює для MySQL v5.6.12 на WAMP: у Windows додайте рядки "wait_timeout" та "max_allowed_packet" вище до розділу [mysqld] розділу: wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok

Дякую @dan вирішив мою річну проблему, ха-ха, я ніколи не додав ці налаштування під розділ[mysqld]
shivgre

Це працює для MySQL v5.7. my-default.ini не створено за замовчуванням, тому вам потрібно створити його.
Родольфо Веласко

5

Інша причина, по якій це може статися, втрачає пам'ять. Перевірте / var / log / messages та переконайтеся, що ваш my.cnf не налаштований так, щоб mysqld виділяв більше пам'яті, ніж ваша машина.

Ваш процес mysqld насправді може бути вбитий ядром, а потім заново запустити процес "safe_mysqld", не усвідомлюючи цього.

Використовуйте верхню частину і спостерігайте за розподілом пам’яті під час її роботи, щоб побачити, що таке ваш зал.

зробіть резервну копію my.cnf перед її зміною.


Це те, що було причиною моєї проблеми. Я додав файл обміну 1 Гб, і він повністю виправив його.
Pikamander2

5

У мене була ця помилка та інші пов'язані з ними, коли я імпортував файл SQL розміром 16 ГБ. Для мене редагування my.ini та встановлення наступного (на основі декількох різних публікацій) у розділі [mysqld]:

max_allowed_packet      = 110M
innodb_buffer_pool_size=511M
innodb_log_file_size=500M
innodb_log_buffer_size = 800M
net_read_timeout        = 600
net_write_timeout       = 600

Якщо ви працюєте під Windows, перейдіть до панелі управління, сервісів та подивіться деталі для MySQL, і ви побачите, де знаходиться мій.ini. Потім після редагування та збереження my.ini перезапустіть службу mysql (або перезавантажте комп'ютер).

Якщо ви використовуєте HeidiSQL, ви також можете встановити деякі або всі з них за допомогою цього.


2

Я оновив "max_allowed_packet" до 1024М, але він все ще не працював. Виявляється, мій сценарій розгортання працював:

mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql

Не забудьте чітко вказати більшу кількість з командного рядка, якщо ви донігуєте це таким чином.


2

Якщо ваші дані включають BLOBдані:

Зауважте, що імпорт даних із командного рядка, здається, заглушує дані BLOB, внаслідок чого помилка "MySQL-сервер пішла".

Щоб уникнути цього, заново створіть mysqldump, але з --hex-blobпрапором:

http://dev.mysql.com/doc/refman/5.7/uk/mysqldump.html#option_mysqldump_hex-blob

який запише файл даних із шістнадцятковими значеннями, а не двійковими серед іншого тексту.

У PhpMyAdmin також є опція "Дамп двійкових стовпців у шістнадцятковій нотації (наприклад," abc "стає 0x616263)", що працює добре.

Зауважте, що існує давня помилка (станом на грудень 2015 року), що означає, що GEOMстовпці не перетворені: резервне копіювання таблиці стовпцем GEOMETRY за допомогою mysqldump? тому використання такої програми, як PhpMyAdmin, здається єдиним вирішенням (опція, зазначена вище, правильно перетворює стовпці GEOM).


1

Якщо потрібно тривалий час, а потім збільшити wait_timeoutзмінну.

Якщо вона не вдається негайно, збільште max_allowed_packetзмінну; це все ще не працює, переконайтеся, що команда дійсна SQL. У шахти були нецільові котирування, які все накрутили.

Крім того, якщо це можливо, розгляньте обмеження кількості вставок однієї команди SQL до, скажімо, 1000. Ви можете створити скрипт, який створює декілька висловлювань з однієї, повторно вводячи частину INSERT ... кожну n вставку.


1

У мене з'явилася аналогічна помилка .. для вирішення цього просто відкрийте файл my.ini..в рядку немає 36 змінити значення максимально дозволеного розміру пакету, тобто. max_allowed_packet = 20М


1

Переконайтеся, що процес mysqld не перезапускається через таких менеджерів сервісів, як systemd.

У мене ця проблема була бродлива з центсом 7. Налаштування конфігурації не допомогло. Виявилося, це було систематизовано, що вбивало службу mysqld кожного разу, коли вона забирала занадто багато пам'яті.


0

У мене сьогодні була подібна помилка при дублюванні бази даних (MySQL-сервер пішов ...), але коли я намагався перезапустити mysql.server перезапуск, у мене з’явилася помилка

ERROR! The server quit without updating PID ...

Ось як я це вирішив: я відкрив програми / утиліти / та запустив Монітор активності

 quit mysqld

тоді вдалося вирішити проблему помилок із

mysql.server restart

0

Я роблю великі обчислення, які передбачають, що з'єднання mysql залишається тривалий час і з великими даними. я стикався з цим питанням "Mysql go away". Тож я спробував оптимізувати запити, але це мені не допомогло, тоді я збільшив обмеження змінних mysql, яке за замовчуванням встановлено на нижнє значення.

wait_timeout max_allowed_packet

Для обмеження того, що вам підходить, повинно бути будь-яке число * 1024 (байти). Ви можете увійти до терміналу, використовуючи команду ' mysql -u ім'я користувача - p ' і можете перевірити та змінити ці змінні межі.


0

Для спільного хостингу GoDaddy

У GoDaddy, що ділиться обліковими записами хостингу, складно налаштувати файли PHP.ini тощо. Однак є інший спосіб, і він просто прекрасно працював для мене. (Я тільки що успішно завантажив 3,8 Мб .sql текстовий файл, що містить 3100 рядків і 145 cols. Використовуючи команду IMPORT в phpMyAdmin, я отримав жахливий MySQL-сервер, який пішов з помилки, і більше інформації немає.)

Я виявив, що Метт Батчер мав правильну відповідь. Як і Метт, я спробував усілякі хитрощі - від експорту баз даних MySQL в шматки розміру кусання, до написання сценаріїв, які розбивають великий імпорт на менші. Але ось що спрацювало:

(1) CPANEL ---> ФАЙЛИ (група) ---> РЕКЛАМА

(2a) Під заголовком "Часткове резервне копіювання" ...
(2b) У розділі "Завантажити резервну копію бази даних MySQL"
(2c) Виберіть свою базу даних та завантажте резервну копію (цей крок необов'язково, але розумно)

(3a) Прямо праворуч від 2b, під заголовком "Відновлення резервної копії бази даних MySQL"
(3b) Виберіть файл імпорту .SQL з локального диска
(3c) Справжнє щастя буде вашим (незабаром ....). 5 секунд

Мені вдалося скористатися цим методом для імпорту однієї таблиці. Ніщо інше в моїй базі даних не постраждало - але саме цим кроком (2) покликаний захистити.

Примітки:
a. Якщо ви не впевнені, як створити файл імпорту .SQL, використовуйте phpMyAdmin для експорту таблиці та модифікації цієї файлової структури.

ДЖЕРЕЛО: Метт Батчер 2010 Стаття


Гаразд, тож негайне голосування, але жодних коментарів щодо того, чому. Чи ця інформація не працювала для когось? Якщо так, будь ласка, поділіться - це працювало на мене, саме тому я додав цю відповідь. Інші відповіді вище для мене не спрацювали, але це рішення все-таки було. То чому ж потік? Якщо ви перебуваєте на GoDaddy і це не працює для вас, я хотів би знати, щоб я міг допомогти. Однак якщо ви не використовуєте спільний хостинг GoDaddy, чому б ви спростували цю відповідь лише тому, що вона не стосується вас ?
ксифіф

0

Якщо збільшення max_allowed_packetне допомагає.

Я отримував таку ж помилку, що і ви, коли імпортував .sqlфайл у мою базу даних через Sequel Pro.

Помилка все ще зберігається після збільшення max_allowed_packetдо, 512Mтому я запустив імпорт у командному рядку замість:

mysql --verbose -u root -p DatabaseName < MySQL.sql

Це дало таку помилку:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

Я знайшов пару корисних запитань щодо StackOverflow:

У моєму випадку мій .sqlфайл був трохи пошкоджений чи щось таке. Дамп MySQL, який ми отримуємо, складається з двох поштових файлів, які потрібно об'єднати, а потім розпакувати. Я думаю, що розпакування було перервано спочатку, залишивши файл із деякими непарними символами та кодуванням. Отримати свіжий дамп MySQL та розпакувати його належним чином працював для мене.

Просто хотіли додати це сюди, якщо інші виявлять, що збільшення max_allowed_packetзмінної не допомагає.



0

У мене те саме питання з

$image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
$image = 'data:image/jpeg;base64,'.$image_base64;
$query = "insert into images(image) values('".$image."')";
mysqli_query($con,$query);

У файлі \ xampp \ mysql \ bin \ my.ini phpmyadmin ми отримуємо лише

[mysqldump]
max_allowed_packet=110M

що саме для mysqldump -u root -p dbname. Я вирішив свою проблему, замінивши вказаний вище код

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.