Увімкніть двійковий режим під час відновлення бази даних із дампа 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-modeвставити файл ini, але він все одно видає ту ж помилку. Що я повинен зробити? Будь ласка, допоможіть.

ОНОВЛЕННЯ

Як запропонував Нік у своєму коментарі, я спробував, $ > 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 база даних - бінарний режим -o <dump.sql
Нік

Це дає ПОМИЛКУ в рядку 1: Невідома команда '\ ☻'.
user1434997

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

Відповіді:


217

Розпакуйте файл, а потім знову імпортуйте.


12
геніальність. Дякую!
klm123

2
Ви маєте на увазі zip, а потім розпакувати?
J86,

13
Ось як у мене це вийшло, розпакуйте db.sql.gz, ви отримаєте db.sql, перейменуйте його знову на db.sql.gz, не стискайте, просто перейменуйте, а потім розпакуйте знову в db.sql і тепер ви отримаєте потрібний файл для імпорту.
MotsManish

@MotsManish Серйозно? Я думав, це жарт. Я спробую подивитися, чи це спрацює.
Джошуа Пінтер,

3
обличчя долоні 🤦‍♀️🤦‍♀️🤦‍♀️🤦‍♀️
Рамбатіно

53

Я зустрічаю ту саму проблему у Windows, відновлюючи файл дампа. Мій файл дампа був створений за допомогою Windows PowerShell та MySQLDump, як:

mysqldump db > dump.sql

Проблема полягає в тому, що за замовчуванням кодування PowerShell - UTF16. Для того, щоб глибше в це, ми можемо використовувати «файл» корисність GNU, і існує версія вікна тут .
Результатом мого файлу дампа є:

Мало-ендіанський текст UTF-16 Unicode, з дуже довгими рядками, з термінаторами рядків 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 поміщає у файли, ось у чому проблема. Дякуємо за відмінне рішення!
Timothy LJ Stewart

4
З практичної ноти я обійшов це після створення файлу в Powershell, перетворивши згенерований файл на UTF-8 за допомогою Notepad ++.
Пітер Меджид,

Ця відповідь, якби я не вкопався, заощадив би години пошуку правильної відповіді. Бажаю, щоб я міг підтримати більше одного разу.
sam452

Я зробив те саме, що і @PeterMajeed. Швидке перетворення та збереження за допомогою NotePad ++ дозволило мені відновити існуючий файл
Stephen R,

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 / gzipped, тому мені спочатку довелося переформатувати файл xvf, а потім він дозволив його імпортувати.
seanbreeden

8

Ви пробували відкрити в notepad ++ (або іншому редакторі) і перетворити / зберегти нас на 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

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: Отримав errno 32
Раду,

Дивіться , якщо цей потік може бути в змозі допомогти вам: stackoverflow.com/questions/22288271 / ...
Ifedi Okonkwo

Дякую. Проблема полягала в тому, що я експортував db зі старою версією phpmyadmin на старий сервер mysql. Не знаю, чому, але половина бази даних була експортована у чистому тексті, а інша половина - у форматі gzip.
Раду

5

Можливо, ваш dump.sql має символ сміття на початку вашого файлу або на початку є порожній рядок.


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 new_database <unzipsqlfile.sql

Я виконав це за допомогою файлу 20go sql із резервної копії jetbackup cpanel mysql. Будьте терплячі чекати vi, виконуючи роботу для великих файлів


0

Ваш файл повинен мати лише розширення .sql, (.zip, .gz .rar) тощо не підтримуватиметься. приклад: dump.sql


0

Ви можете використати це, щоб виправити помилку:

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

2
Чому? Поясніть, будь ласка, як це викликає запитання.
Yunnosch

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а після цього мені довелося використовувати finder (!), Щоб розпакувати його. в терміналі unzip dump.zipoder tar xfz dump.sql[or .gz .tar ...]призводить до повідомлень про помилки.

Нарешті, finder повністю розпакував його, після цього я міг імпортувати файл без проблем.

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