Включить двоичный режим при восстановлении базы данных из дампа SQL


96

Я новичок в MySQL и использую его в Windows. Я пытаюсь восстановить базу данных из файла дампа в MySQL, но получаю следующую ошибку:

$ >mysql -u root -p -h localhost -D database -o < dump.sql
ERROR: ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query: 'SQLite format 3'.

Я попытался вставить --binary-modeini-файл, но он по-прежнему дает ту же ошибку. Что я должен делать? Пожалуйста помоги.

ОБНОВИТЬ

Как предложил Ник в его комментарии, я попытался, $ > mysql -u root -p -h localhost -D database --binary-mode -o < dump.sqlно он дал мне следующее. ERROR at line 1: Unknown command '\☻'. Это файл дампа размером 500 МБ, и когда я просматриваю его содержимое с помощью gVIM, все, что я вижу, - это выражения и данные, которые непонятны.


mysql -u root -p -h localhost -D database --binary-mode -o <dump.sql
Nick

Это дает ОШИБКУ в строке 1: Неизвестная команда '\ ☻'.
user1434997

Я получал эту ошибку, но получил свежий дамп MySQL и попытался повторно импортировать, и все сработало нормально. Наш дамп MySQL состоит из двух заархивированных частей, которые необходимо объединить, а затем разархивировать. Я думаю, что первоначальная распаковка была прервана, в результате получился .sqlфайл со странными символами и кодировками. Вторая попытка сработала нормально.
Джошуа Пинтер

Ответы:


217

Разархивируйте файл и снова импортируйте.


12
гений. Спасибо!
klm123 04

2
Вы имеете в виду zip, а затем распаковать?
J86

13
Вот как это сработало для меня, разархивируйте db.sql.gz, вы получите db.sql, переименуйте его снова в db.sql.gz, не заархивируйте его, просто переименуйте его, затем снова распакуйте в db.sql и теперь вы получите нужный файл для импорта.
MotsManish

@MotsManish Серьезно? Я думал, что это шутка. Я попробую и посмотрю, сработает ли это.
Джошуа Пинтер

3
face palm 🤦‍♀️🤦‍♀️🤦‍♀️🤦‍♀️
Рамбатино

53

Я сталкиваюсь с той же проблемой в Windows, восстанавливая файл дампа. Мой файл дампа был создан с помощью Windows PowerShell и mysqldump, например:

mysqldump db > dump.sql

Проблема связана с кодировкой по умолчанию для PowerShell - UTF16. Чтобы разобраться в этом, мы можем использовать «файловую» утилиту GNU, и существует версия для Windows. здесь .
Результат моего файла дампа:

Текст Unicode UTF-16 с прямым порядком байтов, с очень длинными строками, с терминаторами строк CRLF.

Затем требуется преобразование системы кодирования, и есть различные программы, которые могут это сделать. Например, в emacs,

M-x set-buffer-file-coding-system

затем введите требуемую систему кодирования, такую ​​как utf-8.

И в будущем для лучшего результата mysqldump используйте:

mysqldump <dbname> -r <filename>

а затем вывод обрабатывается mysqldumpсам по себе, но не перенаправлением powershell.

ссылка: /dba/44721/error- while-restoring-a-database-from-an-sql-dump


mysqldump <dbname> -r <filename> любой, кто использует системы Windows или DOS, это решение. Преобразование файлов UTF-8 - это отвлечение. Используйте параметр -r, который направляет вывод на имя файла и обрабатывает перевод строки CRLF возврата каретки (\ r \ n), который Windows помещает в файлы, вот где проблема. Спасибо за отличное решение!
Тимоти LJ Стюарт

4
С практической точки зрения, я обошел это после создания файла в Powershell, преобразовав сгенерированный файл в UTF-8 с помощью Notepad ++.
Питер Маджид

Этот ответ, если бы я не копался, сэкономил бы мне часы поиска правильного ответа. Хотел бы я проголосовать больше одного раза.
sam452

Я сделал то же, что и @PeterMajeed. Быстрое преобразование и сохранение с помощью NotePad ++ позволило мне восстановить существующий файл
Стивен Р.

18

На компьютере с Windows выполните предыдущие шаги.

  1. Открыть файл в блокноте.
  2. Нажмите на Сохранить как
  3. Выберите тип кодировки UTF-8.

Теперь создайте свой db.


Это сработало для меня для файла резервной копии SQL, который был создан путем запуска mysqldump через Powershell. Вывод Poweshell был UTF-16. Переход на UTF-8 решил проблему и позволил мне восстановить мою базу данных из файла резервной копии.
Гарри Мантеакис,

9

Извлеките файл с помощью инструмента архивирования Tar. вы можете использовать это так:

tar xf example.sql.gz

1
Это был ответ для меня. Сначала я заархивировал файл .sql.gz, что привело к "двоичной" ошибке при импорте. Оказалось, что файл был заархивирован tar / gzip, поэтому мне пришлось сначала заархивировать файл xvf, а затем он позволил мне его импортировать.
seanbreeden

8

Вы пробовали открыть в блокноте ++ (или другом редакторе) и преобразовать / сохранить нас в UTF-8?

Смотрите: notepad ++ преобразование файла, закодированного в ansi, в utf-8

Другой вариант - использовать textwrangle для открытия и сохранения файла как UTF-8: http://www.barebones.com/products/textwrangler/


3
Спасибо. Это помогло мне. Откройте файл в NotePad ++. Кодирование> Преобразовать в UTF 8.
Абхиджит Нагре

Также обратите внимание на значительное изменение размера файла после того, как вы «сохраните как» существующий файл .sql с кодировкой utf-8! Почти вдвое меньше размера данного файла. В моем случае mysqldump был взят с помощью Windows Power Shell, эта программа испортила кодировку.
tusar 04

6

Однажды у меня была эта ошибка после запуска mysqldumpв Windows PowerShell, например:

mysqldump -u root p my_db --no-data --no-create-db --no-create-info --routines --triggers --skip-opt --set-gtid-purged=OFF > db_objects.sql

Что я сделал, так это изменил его на это (труба вместо Set-Content):

mysqldump -u root p my_db --no-data --no-create-db --no-create-info --routines --triggers --skip-opt --set-gtid-purged=OFF | Set-Content db_objects.sql

И проблема ушла!


Я получаю mysqldump: есть ошибка 32
Раду

Посмотрите, может ли этот поток помочь вам: stackoverflow.com/questions/22288271/…
Ифеди Оконкво

Спасибо. Проблема заключалась в том, что я экспортировал базу данных со старой версией phpmyadmin на старый сервер mysql. Не знаю, почему, но половина базы данных была экспортирована в виде открытого текста, а другая половина - в сжатом виде.
Radu


5

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

gunzip < compressed-sqlfile.gz | mysql -u root -p

Не забудьте заменить compressed-sqlfile.gz именем сжатого файла.

Восстановление .gz не будет работать без указанной выше команды.


3

Вы должны решить проблему с файлом dump.sql. Используйте Sequel Pro, проверьте кодировку вашего файла. Это должны быть символы мусора в вашем dump.sql.


3

У меня была такая же проблема, но я обнаружил, что файл дампа на самом деле был резервной копией сервера MSSQL, а не MySQL.

Иногда устаревшие файлы резервных копий играют с нами злую шутку. Проверьте свой файл дампа.

В окне терминала:

~$ cat mybackup.dmp 

Результат был:

TAPE??G?"5,^}???Microsoft SQL ServerSPAD^LSFMB8..... etc...

Чтобы остановить обработку команды cat:

CTRL + C


1

Файл, который вы пытаетесь импортировать, представляет собой zip-файл. Разархивируйте файл и повторите попытку импорта.


1

В Linux Разархивируйте файл с помощью gunzip. Отредактируйте распакованный файл sql с помощью

vi unzipsqlfile.sql

Удалите первую двоичную строку с помощью esc dd перейдите в конец файла с помощью esc shift g удалите последнюю двоичную строку с помощью dd сохраните файл esc x: Затем повторно импортируйте в mysql с помощью:

mysql -u имя пользователя -p новая_ база данных <unzipsqlfile.sql

Я выполнил это с помощью sql-файла 20go из резервной копии mysql cpanel jetbackup. Подождите, пока vi выполнит работу для больших файлов


0

Ваш файл должен иметь только расширение .sql, (.zip, .gz .rar) и т. Д. Не поддерживаются. пример: dump.sql


0

Вы можете использовать это, чтобы исправить ошибку:

zcat {address_sql_database(.tar.gz)} | mysql -u root -p {database_name} --binary-mode

2
Зачем? Пожалуйста, объясните, как он отвечает на вопрос.
Юннош

0

Я знаю, что исходный вопрос с плакатами был решен, но я пришел сюда через Google, и различные ответы в конечном итоге привели меня к тому, что я обнаружил, что мой SQL был сброшен с другой кодировкой по умолчанию, чем та, которая использовалась для его импорта. Я получил ту же ошибку, что и исходный вопрос, но, поскольку наш дамп был передан другому клиенту MySQL, мы не могли пойти по пути, открыв его другим инструментом и сохранив по-другому.

Для нас решение оказалось --default-character-set=utf8mb4вариантом, который можно использовать как при вызове, mysqldumpтак и при вызове для импорта через mysql. Конечно, значение параметра может отличаться для других, сталкивающихся с той же проблемой, просто важно сохранить его неизменным, так как для серверов (или инструментов) по умолчанию может использоваться любая кодировка.


Не могли бы вы поделиться всей строкой, которую вы написали? Поскольку у меня такая же ситуация, как и у вас. Я все еще не понимаю, почему у меня это не работает. он находится на том же сервере, пытается создать постановку веб-сайта, а mysqldump -uUSER -p user_db | gzip > user_db_$(date +"%Y%m%d_%H%M").sql.gzзатем пытается импортировать его, используяgunzip -c user_db_datetime.sql.gz | mysql -uUSER -p user_db
Ромео Патрик,

Наша строка не будет вам полезна, так как это огромный набор различных пользовательских настроек. Как вы описываете свою ситуацию, мой ответ неприменим: моя проблема возникла из-за того, что компьютер / соединение для сброса были настроены иначе, чем восстанавливающий, поэтому нам нужно было указать кодировку по умолчанию, чтобы заставить их быть идентичными.
Torque

0

Старый но золотой!

На MacOS (Catalina 10.15.7) это было немного странно: мне пришлось переименовать свой dump.sqlв, dump.zipи после этого мне пришлось использовать поисковик (!), Чтобы распаковать его. в терминале unzip dump.zipoder tar xfz dump.sql[or .gz .tar ...]приводит к сообщению об ошибке.

Наконец, Finder полностью разархивировал его, после чего я мог без проблем импортировать файл.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.