Lỗi khi nhập tệp kết xuất MySQL lớn bao gồm BLOB nhị phân trong Windows


9

Tôi đang cố gắng nhập tệp kết xuất MySQL mà tôi đã nhận được từ công ty lưu trữ của mình vào máy phát triển Windows của mình và tôi đang gặp vấn đề.

Tôi đang nhập cái này từ dòng lệnh và tôi đang gặp một lỗi rất lạ:

LRI 2005 (HY000) tại dòng 3118: Máy chủ lưu trữ máy chủ MySQL không xác định '╖? * Á ± dÆ╦N╪Æ · h ^ ye "π╩i╪ Z + - $ ▼ ₧ Y.∞┌ | l∞ / l ╞⌂î7æ▌X█XE.ºΓ [; ï ♣ é ♂ ╜┤║

văn bản thay thế

Tôi đang đính kèm ảnh chụp màn hình vì tôi cho rằng dữ liệu nhị phân sẽ bị mất ...

Tôi không chắc chính xác vấn đề là gì, nhưng hai vấn đề tiềm ẩn là kích thước của tệp (2 Gb) không lớn lắm, nhưng nó cũng không nhỏ, và thứ hai là thực tế là nhiều bảng trong số này có Hình ảnh JPG trong đó (đó là lý do tại sao tệp lớn nhất 2Gb, đối với hầu hết các phần).
Ngoài ra, kết xuất được lấy trong một máy Linux và tôi đang nhập cái này vào Windows, không chắc điều đó có thể gây thêm vấn đề không (tôi hiểu là không nên)

Bây giờ, rác nhị phân đó là lý do tại sao tôi nghĩ rằng hình ảnh trong tệp có thể là một vấn đề, nhưng tôi đã có thể nhập các bãi chứa tương tự từ cùng một công ty lưu trữ trong quá khứ, vì vậy tôi không chắc vấn đề có thể là gì.

Ngoài ra, cố gắng xem xét tệp này (đặc biệt là dòng 3118) là không thể đưa ra kích thước của nó (tôi không thực sự tiện dụng với các công cụ dòng lệnh Linux như grep, sed, v.v.).

Các tập tin thể bị hỏng, nhưng tôi không chắc chắn làm thế nào để kiểm tra nó. Những gì tôi đã tải xuống là một tệp .gz, mà tôi đã "thử nghiệm" với WinRar và nó nói rằng nó có vẻ ổn (tôi giả sử gz có một số loại CRC). Nếu bạn có thể nghĩ ra một cách tốt hơn để kiểm tra nó, tôi rất muốn thử nó.

Bất kỳ ý tưởng những gì có thể xảy ra / làm thế nào để vượt qua lỗi này?

Tôi không đặc biệt gắn bó với dữ liệu, vì tôi chỉ muốn đây là bản sao cho nhà phát triển, vì vậy nếu tôi phải mất một vài bản ghi, tôi sẽ ổn với điều đó, miễn là lược đồ vẫn hoàn hảo.

Cảm ơn!
Daniel

Câu trả lời:


14

Vì lý do này tôi luôn luôn sử dụng mysqldump --hex-blob.

Kết xuất lại cơ sở dữ liệu mã hóa các đốm màu bằng cách sử dụng công tắc này và nó sẽ hoạt động.

Bạn có thể thử nhập nó bằng IDE máy khách mysql như quản trị viên sqlyog hoặc mysql. Nó làm việc cho tôi một lần.


Tôi sẽ thử hỏi những người lưu trữ về điều đó, hãy xem điều đó có làm được không. Tuy nhiên, điều đó có thể mất vài ngày :-( - Điều khiến tôi bối rối là tôi đã có thể nhập các bãi rác nhị phân khác từ chúng trong quá khứ. Có ai biết nó có thể là gì không?
Daniel Magliola

hãy thử nhập từ quản trị viên mysql không phải từ dòng lệnh
Paul

Nếu bạn có thể nhập trên linux và bạn có thể nhập trên windows sau khi xuất bằng --hex-blob, bạn có thể tạm thời nhập vào linux và xuất nó từ đó với --hex-blob. Hãy cho tôi biết nếu bạn cần trợ giúp (aka: hộp linux) với điều đó.
Pupeno

Xem câu trả lời của @ BobC bên dưới để biết giải pháp không yêu cầu xuất khẩu đặc biệt.
T. Brian Jones

7

Bạn không nhất thiết phải sử dụng tùy chọn --hex-blob. Tôi vừa tự giải quyết vấn đề này và vấn đề là tôi cần --max_allowed_packet được đặt thành một giá trị đủ lớn để chứa blob dữ liệu lớn nhất mà tôi sẽ tải. Lệnh khôi phục của bạn sẽ trông giống như:

mysql -u user -h hostname --max_allowed_packet=32M dbname < dumpfile.sql

Nếu bạn sử dụng tùy chọn --hex-blob, bạn sẽ tăng đáng kể kích thước của bản sao lưu của mình - theo hệ số 2 trở lên. LƯU Ý: để khôi phục cùng dữ liệu mà tôi đã khôi phục bằng lệnh trên, yêu cầu thiết lập --max_allowed_packet = 64M trong my.ini (cnf) và khởi động lại máy chủ NHƯ SAU, đặt nó thành 64M trên dòng lệnh để khôi phục kết xuất được tạo bằng tùy chọn --hex-blob.


Điều này làm việc tuyệt vời và có lẽ nên là câu trả lời được chấp nhận.
T. Brian Jones

2

Vẫn có thể xảy ra sự cố do kích thước tệp lớn, vì vậy hãy đảm bảo bạn đặt gói tối đa được phép thành một số giá trị cao (param cho lệnh mysql).


1

Ok, tôi đã có vấn đề này ngày hôm nay. Nhưng vấn đề của tôi là cơ sở dữ liệu đã bị hủy khi tôi nhận ra rằng bản sao lưu đã bị hỏng. Vì vậy, không --hex-blobcho tôi! Để có thể sửa nó, tôi đã tạo một đoạn script nhỏ trong PHP để chuyển đổi "chuỗi nhị phân" thành biểu diễn hex trong đó các giá trị được biểu diễn như "_binary '!@{#!@{#'"...

Nó đang sử dụng REGEX để phân tích cú pháp SQL, điều này không hoàn toàn an toàn, nhưng nó đã làm việc cho tôi.

<?php
function convertEncoding($str)
{
    $r = '';
    for ($i = 0; $i < mb_strlen($str); $i++) {
        $r .= sprintf('%02X', mb_ord(mb_substr($str, $i, 1, 'UTF-8'), 'UTF-8'));
    }

    return '0x' . $r;
}


$str = file_get_contents('data.sql');

$newStr = preg_replace_callback('/_binary \'(.+?)\'(,|\))/im', function ($str) {
    $s = convertEncoding(stripcslashes($str[1]));
    echo 'Translated: ' . $str[1] . ' => ' . $s . PHP_EOL;
    echo 'Ending char was: ' . $str[2] . PHP_EOL;
    return $s . $str[2];
}, $str);

file_put_contents('fixed.sql', $newStr) ;

Tôi hy vọng nó sẽ cứu ai đó đau đầu mà tôi có!


0

Tôi gặp vấn đề tương tự khi khôi phục tệp kết xuất từ ​​máy chủ Linux có chứa dữ liệu nhị phân. Các lỗi là một cái gì đó nhưERROR 1064 (42000) at line 551: You have an error in your SQL syntax;

Tệp kết xuất này có thể được nhập thành công vào máy chủ Linux nhưng không phải Windows.

Tôi đã thử với --hex-blobtùy chọn và --max_allowed_packetthậm chí chuyển dữ liệu bằng đường ống thay vì tệp .sql, nhưng không có may mắn.

Cuối cùng tôi đã giải quyết điều này bằng cách sử dụng MySQL Workbench và lệnh được tạo giống như

Running: mysql.exe --defaults-file="c:\users\admini~1\appdata\local\temp\tmp1fzxkx.cnf"  --protocol=tcp --host=localhost --user=root --port=3306 --default-character-set=utf8 --comments --database=platform  < "E:\\direcotory\\dump.sql"

Sau đó, tôi đã thử với --default-character-set=utf8từ dòng lệnh và nó đã làm việc. Hy vọng điều này sẽ giúp được ai đó.

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.