Kesalahan mengimpor file dump MySQL besar yang mencakup BLOB biner di Windows

9

Saya mencoba mengimpor file dump MySQL, yang saya dapatkan dari perusahaan hosting saya, ke mesin Windows dev saya, dan saya mengalami masalah.

Saya mengimpor ini dari baris perintah, dan saya mendapatkan kesalahan yang sangat aneh:

ERROR 2005 (HY000) pada baris 3118: Host server MySQL tidak dikenal '╖? * Á ± dÆ╦N╪Æ · h ^ ye "π╩i╪ Z + - $ ▼ ₧ ╬Y.∞┌ | ↕╘l∞ / l ╞⌂î7æ▌X█XE.ºΓ [; ╦ï ♣ éµ♂º╜┤║] .♂┐φ9dë╟█'╕ÿG∟═0à¡úè ♦ ╥ ↑ ù ♣ ♦ ¥ '╔NÑ' (11004)

teks alternatif

Saya melampirkan tangkapan layar karena saya berasumsi data biner akan hilang ...

Saya tidak yakin apa masalahnya, tetapi dua masalah potensial adalah ukuran file (2 Gb) yang tidak terlalu besar, tetapi juga tidak kecil, dan yang lainnya adalah fakta bahwa banyak dari tabel ini memiliki Gambar JPG di dalamnya (itulah sebabnya file berukuran 2Gb besar, untuk sebagian besar).
Juga, dump diambil di mesin Linux dan saya mengimpor ini ke Windows, tidak yakin apakah itu dapat menambah masalah (saya mengerti seharusnya tidak)

Sekarang, sampah biner itu sebabnya saya pikir gambar dalam file mungkin menjadi masalah, tetapi saya sudah bisa mengimpor dump serupa dari perusahaan hosting yang sama di masa lalu, jadi saya tidak yakin apa masalahnya.

Juga, mencoba untuk melihat file ini (dan baris 3118 khususnya) agak tidak mungkin mengingat ukurannya (saya tidak benar-benar berguna dengan alat baris perintah Linux seperti grep, sed, dll).

File mungkin rusak, tetapi saya tidak yakin bagaimana cara memeriksanya. Apa yang saya unduh adalah file .gz, yang saya "uji" dengan WinRar dan katanya terlihat OK (saya anggap gz memiliki semacam CRC). Jika Anda dapat memikirkan cara yang lebih baik untuk mengujinya, saya ingin mencobanya.

Ada ide apa yang bisa terjadi / bagaimana cara mengatasi kesalahan ini?

Saya tidak terlalu terikat dengan data pada khususnya, karena saya hanya ingin ini sebagai salinan untuk dev, jadi jika saya harus kehilangan beberapa catatan, saya baik-baik saja dengan itu, selama skema tetap sehat.

Terima kasih!
Daniel

Daniel Magliola
sumber

Jawaban:

14

Untuk alasan ini saya selalu menggunakan mysqldump --hex-blob.

Buang ulang basis data yang menyandikan gumpalan menggunakan sakelar ini dan itu akan berfungsi.

Anda dapat mencoba mengimpornya menggunakan windows mysql client IDE seperti sqlyog atau administrator mysql. Itu pernah bekerja untuk saya.

Paul
sumber
Saya akan mencoba meminta orang-orang hosting untuk itu, mari kita lihat apakah itu berhasil. Itu mungkin memakan waktu beberapa hari, namun :-( - Yang membingungkan saya adalah bahwa saya sudah bisa mengimpor dump biner lainnya dari mereka di masa lalu. Adakah yang tahu apa itu mungkin?
Daniel Magliola
coba impor dari administrator mysql bukan dari baris perintah
Paul
Jika Anda dapat mengimpor di linux, dan Anda dapat mengimpor di windows setelah mengekspor dengan - hex-blob, Anda dapat mengimpor sementara ke linux, dan mengekspornya dari sana dengan --hex-blob. Beritahu saya jika Anda membutuhkan bantuan (alias: kotak linux) dengan itu.
pupeno
Lihat jawaban @ BobC di bawah ini untuk solusi yang tidak memerlukan ekspor khusus.
T. Brian Jones
7

Anda tidak perlu menggunakan opsi --hex-blob. Saya baru saja menyelesaikan masalah ini sendiri dan masalahnya adalah bahwa saya perlu --max_allowed_packet disetel ke nilai yang cukup besar untuk mengakomodasi gumpalan data terbesar yang akan saya muat. Perintah restore Anda akan terlihat seperti:

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

Jika Anda menggunakan opsi --hex-blob, Anda akan secara signifikan meningkatkan ukuran cadangan Anda - dengan faktor 2 atau lebih. CATATAN: untuk mengembalikan data yang sama dengan yang saya kembalikan dengan perintah di atas diperlukan pengaturan --max_allowed_packet = 64M di my.ini (cnf) dan memulai kembali server SEBAGAIMANA ADA untuk 64M pada baris perintah untuk mengembalikan dump yang dibuat dengan opsi --hex-blob.

Bob C
sumber
Ini bekerja dengan baik dan mungkin seharusnya menjadi jawaban yang diterima.
T. Brian Jones
2

Mungkin masih ada masalah karena ukuran file yang besar jadi pastikan Anda mengatur paket max-allowed-packet ke nilai tinggi (param untuk perintah mysql).

arun
sumber
1

Oke, saya punya masalah hari ini. Tetapi masalah saya adalah bahwa database sudah jatuh ketika saya menyadari bahwa cadangan rusak. Jadi, tidak --hex-blobuntukku! Untuk dapat memperbaikinya saya membuat skrip kecil dalam PHP yang mengubah "string biner" menjadi representasi hex di mana nilai-nilai diwakili seperti "_binary '!@{#!@{#'"...

Ini menggunakan REGEX untuk mem-parsing SQL, yang tidak sepenuhnya aman, tapi itu berhasil bagi saya.

<?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) ;

Saya berharap itu menyelamatkan seseorang sakit kepala yang saya dapatkan!

KnF
sumber
0

Saya memiliki masalah serupa ketika mengembalikan file dump dari server Linux yang berisi data biner. Kesalahannya adalah sesuatu sepertiERROR 1064 (42000) at line 551: You have an error in your SQL syntax;

File dump ini dapat berhasil diimpor ke server Linux tetapi tidak ke Windows.

Saya telah mencoba dengan --hex-blobopsi dan --max_allowed_packetdan bahkan mentransfer data dengan pipa daripada file .sql, tetapi tidak berhasil.

Saya akhirnya menyelesaikan ini dengan menggunakan MySQL Workbench, dan perintah yang dihasilkan seperti

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"

Kemudian saya mencoba dengan --default-character-set=utf8dari baris perintah dan itu berhasil. Semoga ini bisa membantu seseorang.

leetom
sumber