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) и установил значение this:, max_allowed_packet = 64Mперезапустил MySQL и повторно запустил импорт.
Брент Мацель

Я загружал большие файлы в базу данных с веб-вопросами. Это помогло, спасибо ... :-)
inf3rno

@BrentMatzelle Это, безусловно, позаботилось о проблеме "Mysql ушел". Спасибо!
апреля 13 апреля

2
Я не могу найти wait_timeoutлинию
Оки Эри Ринальди

5
в случае с windows (с Xampp) это был файл my.ini и innodb_lock_wait_timeout
Ananda

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'
Арт

Это не является постоянным в том смысле, что значение будет сброшено при перезагрузке сервера (в конце концов), но это также не только для текущего сеанса. Настройка 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

семпл для wamp, max_allowed_packet = 64M
Эндрю

19

Если вы работаете со значениями по умолчанию, у вас есть много возможностей для оптимизации конфигурации MySQL.

Первым шагом, который я рекомендую, является увеличение max_allowed_packet до 128M.

Затем загрузите скрипт учебника по настройке MySQL и запустите его. Он предоставит рекомендации для нескольких аспектов вашей конфигурации для лучшей производительности.

Также обратите внимание на настройку значений времени ожидания как в MySQL, так и в PHP.

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


Спасибо, я уже установил max_allowed_packet в 16M, затем нашел этот вопрос и поднял его до 32M, думая, что этого будет достаточно, но потом увидел ваш ответ, и 128M определенно работает. Я понял, что весь оператор 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 без вашего ведома.

Используйте top и следите за распределением памяти во время работы, чтобы увидеть, какой у вас запас.

сделайте резервную копию 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, и вы увидите, где находится my.ini. Затем после редактирования и сохранения my.ini перезапустите службу mysql (или перезагрузите компьютер).

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


2

Я обновил «max_allowed_packet» до 1024M, но он все еще не работал. Оказывается, мой сценарий развертывания был запущен:

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/en/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.

У меня была эта проблема в vagrant с centos 7. Настройки не помогли. Оказалось, что именно systemd убивал службу mysqld каждый раз, когда занимал слишком много памяти.


0

У меня была похожая ошибка сегодня при дублировании базы данных (сервер MySQL ушел ...), но когда я попытался перезапустить mysql.server restart, я получил ошибку

ERROR! The server quit without updating PID ...

Вот как я это решил: я открыл Приложения / Утилиты / и запустил Activity Monitor

 quit mysqld

затем смог решить проблему с ошибкой

mysql.server restart

0

Я делаю некоторые большие вычисления, которые включают в себя соединение MySQL, чтобы остаться надолго и с тяжелыми данными. я столкнулся с этим "Mysql уйти проблема". Поэтому я попытался оптимизировать запросы, но это мне не помогло, тогда я увеличил предел переменных mysql, который по умолчанию установлен на более низкое значение.

wait_timeout max_allowed_packet

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


0

Для общего хостинга GoDaddy

На учетных записях общего хостинга GoDaddy сложно настроить файлы PHP.ini и т. Д. Однако есть и другой способ, и он просто отлично сработал для меня. (Я только что успешно загрузил 3.8Mb текстовый файл .sql, содержащий 3100 строк и 145 столбцов. Используя команду IMPORT в phpMyAdmin, я получил страшный сервер MySQL, ушел , и никакой дополнительной информации.)

Я обнаружил, что у Мэтта Батчера был правильный ответ. Как и Мэтт, я испробовал все виды трюков, от экспорта баз данных MySQL в виде кусочков до написания сценариев, которые разбивают большой импорт на более мелкие. Но вот что сработало:

(1) CPANEL ---> ФАЙЛЫ (группа) ---> РЕЗЕРВНОЕ КОПИРОВАНИЕ

(2a) В разделе «Частичное резервное копирование» ...
(2b) В разделе «Загрузить резервную копию базы данных MySQL»
(2c) Выберите базу данных и загрузите резервную копию (этот шаг не обязателен, но целесообразен)

(3a) Прямо справа от 2b, под заголовком «Восстановление резервной копии базы данных MySQL»
(3b) Выберите файл импорта .SQL с вашего локального диска
(3c) Истинное счастье будет вашим (в скором времени ....) Моя добыча заняла около 5 секунд

Я смог использовать этот метод для импорта одной таблицы. Ничего другого в моей базе данных не было затронуто, но именно это защищает шаг (2) выше.

Примечания:
а. Если вы не знаете, как создать файл импорта .SQL, используйте phpMyAdmin для экспорта таблицы и изменения этой файловой структуры.

ИСТОЧНИК: Matt Butcher 2010 Статья


Итак, немедленное понижение, но без комментариев, почему. Эта информация не работает для кого-то? Если это так, пожалуйста, поделитесь - это сработало для меня, поэтому я добавил этот ответ. Другие приведенные выше ответы не сработали для меня, но это решение сработало. Так почему отрицательный голос? Если вы находитесь на GoDaddy, и это не работает для вас, я хотел бы знать, чтобы я мог помочь. Однако, если вы не используете общий хостинг GoDaddy, почему вы должны понизить этот ответ только потому, что он к вам не относится ?
cssyphus

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 поставляется в виде двух zip-файлов, которые необходимо объединить, а затем разархивировать. Я думаю, что распаковка была сначала прервана, в результате чего в файле появились странные символы и кодировки. Получение свежего дампа 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.