Lỗi trong khi khôi phục Cơ sở dữ liệu từ kết xuất SQL


14

Tôi cực kỳ mới với MySQL và đang chạy nó trên Windows. Tôi đang cố gắng khôi phục Cơ sở dữ liệu từ tệp tin lưu trữ trong MySQL, nhưng tôi gặp lỗi sau:

$ >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'.

Tôi đã thử $ > mysql -u root -p -h localhost -D database --binary-mode -o < dump.sqlnhưng điều này đã cho tôi như sau ERROR at line 1: Unknown command '\☻'. Đây là tệp kết xuất 500 Mb và khi tôi xem nội dung của nó bằng gVIM, tất cả những gì tôi có thể thấy là các biểu thức và dữ liệu không thể hiểu được. Ngoài ra khi tôi cố gắng sao chép nội dung từ tệp để đăng ở đây, tất cả những gì tôi có thể sao chép là: SQLite format 3Loại này có vẻ lạ.


1
Bạn có phải là người đã sao lưu?
Menelaos Bakopoulos

Tôi đã gặp lỗi này nhưng đã có một kết xuất MySQL mới và đã thử nhập lại và nó hoạt động tốt. Kết xuất MySQL của chúng tôi có hai phần được nén phải được nối và sau đó giải nén. Tôi nghĩ rằng việc giải nén ban đầu đã bị gián đoạn, dẫn đến một .sqltệp có các ký tự và mã hóa kỳ lạ. Nỗ lực thứ hai hoạt động tốt.
Joshua Pinter

Câu trả lời:


18

Tham chiếu đến --binary-mode(được giới thiệu trong MySQL 5.6.3) có lẽ là một sự phân tâm.

Có vẻ như bạn đang xử lý một tệp đầu ra mysqldump ở đó. Hãy thử các filetiện ích.

shell> file dumpfile.sql
dumpfile.sql: ASCII text

Nếu bạn không nhận được ASCII textphản hồi, bạn đang xử lý một cái gì đó hoàn toàn không phải là tệp kết xuất mysqldumphoặc bạn đang xử lý một cái gì đó đã được nén (ví dụ như với gzip hoặc bzip2), mà bạn ' d cần giải nén trước khi đưa nó vào mysql.

Nếu bạn thấy SQLite 3.x databasethì bạn chắc chắn có câu trả lời của mình ... đó là cơ sở dữ liệu SQLite thô chứ không phải tệp kết xuất MySQL.

Thật vậy, một vài byte đầu tiên của cơ sở dữ liệu SQLite là:

53 51 4C 69 74 65 20 66  SQLite f
6F 72 6D 61 74 20 33 00  ormat 3^@

Lưu ý rằng octet thứ 16 ở đây là 0x00, giải thích ERROR: ASCII '\0' appeared in the statement...thông báo trong trường hợp này. Đề nghị --binary-modephù hợp là một báo động sai.


Người dùng Windows: tiện ích 'tập tin' là một công cụ của Unix, nhưng phiên bản Windows có thể được tìm thấy ở đây .


Tôi đang gặp lỗi này và khi chạy file MySQL.sqlnó trở lại UTF-8 Unicode text, with very long lines. Có ý kiến ​​gì không?
Joshua Pinter

@JoshuaPinter thử less -S MySQL.sql. Bạn thấy gì? Nó trông giống như một tệp kết xuất MySQL? Chúng là phần lớn con người có thể đọc được. (Sử dụng qđể thoát.)
Michael - sqlbot

1
Vâng, dòng đầu tiên trông như thế -- MySQL dump 10.13 Distrib 5.7.22, for Linux (x86_64). Và di chuyển xuống qua thanh không gian hiển thị các hướng dẫn điển hình của MySQL. Tuy nhiên, nếu tôi tiếp tục đi xuống, nó sẽ đóng băng trên một dòng nhất định. Cùng một dòng xuất hiện trong thông báo lỗi. Tôi đã xem xét kỹ hơn và phát hiện ra rằng kết xuất MySQL đã không được giải nén đúng cách ngay lần đầu tiên. Không chắc chắn những gì đã sai nhưng khi tôi giải nén lại, nó hoạt động tốt. Tôi đã thêm một câu trả lời về nó ở đây cho những người khác: stackoverflow.com/a/51432853/293280 Cảm ơn rất nhiều vì sự giúp đỡ của bạn và trả lời nhanh chóng. 👍
Joshua Pinter

6

các cửa sổ

Tạo tập tin kết xuất của bạn với lệnh này

.\mysqldump [dbname] -r [filename.sql]

Sử dụng:

.\mysqldumb --help

-r, --result-file = tên

                 Direct output to a given file. This option should be used
                 in systems (e.g., DOS, Windows) that use carriage-return
                 linefeed pairs (\r\n) to separate text lines. This option
                 ensures that only a single newline is used.

2
Đây là câu trả lời chính xác. Powershell's> tạo tệp được mã hóa UTF-16 đang gây ra sự cố. Tìm kiếm Powershell tại đây: dev.mysql.com/doc/refman/5.7/en/mysqldump.html
SimZal

1

Tôi đã gặp lỗi này một lần, sau khi chạy mysqldumptrên Windows PowerShell như vậy:

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

Những gì tôi đã làm là thay đổi nó thành cái này (thay vào đó là 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

Và vấn đề đã biến mất!


1

Tôi cũng vậy trong PowerShell

Tôi gặp phải sự cố này khi tôi đang sử dụng PowerShell để gọi mysqldump> để chuyển đầu ra thành tệp. PowerShell đã sử dụng mã hóa không chính xác khi tạo tệp và tôi đã gặp lỗi tương tự khi tôi cố gắng nhập tệp bằng mysql .. <export-file.sql

Tôi thấy rằng việc đặt mã hóa mặc định thành UTF8 trong phiên PowerShell đã giải quyết vấn đề này.

Độ phân giải của tôi - Đã kiểm tra PowerShell 5.1:

$PSDefaultParameterValues["Out-File:Encoding"] = "utf8";

Ví dụ: Cách tôi sản xuất xuất (đơn giản hóa) :

$cmdExportDB = "mysqldump --host $Host --databases $DbName -u $UID =p$PWD > $fileName";
Invoke-Expression "& $cmdExportDB";

Lưu ý: Đã phát hiện ra điều này không hoạt động trên PowerShell 4.0

Môi trường phát triển của tôi đã chạy 5.1, nhưng prod ở 4.0 và bản sửa lỗi ban đầu của tôi không hoạt động trong các phiên bản cũ hơn của PowerShell.

Cần sử dụng | Set-Content -Encoding UTF8 $fileName

Điều này đã được đề xuất bởi Ifedi



0

Ai đó đã gửi cho tôi một gtar nén. Thậm chí không quá quen thuộc với gtar, nhưng nó là một định dạng nén khác.

$ file core_production-1432173533.sql.gtar
core_production-1432173533.sql.gtar: gzip compressed data, from Unix, last modified: Wed May 20 21:59:31 2015

Tuy nhiên, tôi đã có thể giải nén nó giống như bình thường:

tar -zxvf core_production-1432173533.sql.gtar
$ file core_production-1432173533.sql
core_production-1432173533.sql: ASCII text, with very long lines

Và sau đó tôi có thể thực hiện việc nhập:

mysql -u root -p -h localhost core_production < core_production-1432173533.sql

0

Giải pháp: Giải nén tệp sao lưu và sau đó khôi phục kết xuất sql được trích xuất này.

Thí dụ :

Sao lưu đã được thực hiện dưới dạng tệp dump.sql.gz và giải nén nó bằng cách sử dụng cmd gunzip như sau,

shell>  gunzip dump.sql.gz

Và RESTORE trích xuất tập tin dump.sql.

Tham khảo: Giới thiệu về chế độ tương tác và nhị phân của MySQL.

http://dev.mysql.com/doc/refman/5.7/en/mysql-command-options.html#option_mysql_binary-mode

Nó hoạt động cho tôi và tất cả các thiết lập !!


0

Trong trường hợp của tôi, các tập tin đã bị hỏng. Cơ sở dữ liệu được nén với phần mở rộng .bz2nhưng nó thực sự là một .tar.bz2.

Giải mã bằng cách sử dụng bzip2 -dkkhông tạo ra bất kỳ lỗi nào và tạo tệp. Sử dụng lệnh filetrên các tập tin đầu ra bzip2 compressed data, block size = 900kđể nó thậm chí trông không sai khi sử dụng nó.

Tôi đã phải sử dụng tar -xf myfile.bz2

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.