导入大型MySQL转储文件时出错,该文件包含Windows中的二进制BLOB


9

我试图将我从托管公司获得的MySQL转储文件导入Windows开发计算机,但遇到了问题。

我是从命令行导入的,并且出现了一个很奇怪的错误:

第3118行的错误2005(HY000):未知的MySQL服务器主机'╖?*á±dÆ╦N╪Æ·h ^ ye“π影片i╪Z +-$▼₧╬Y.∞┌|↕╘l∞/ l ╞⌂î7æ▌X█XE.º[[;╦ï♣éµ♂º╜┤║].♂┐φ9dë╟█'╕ÿG∟═0à¡úè♦╥↑ù♣♦¥'╔NÑ'(11004)

替代文字

我附上屏幕截图是因为我假设二进制数据将会丢失...

我不确定是什么问题,但是两个潜在的问题是文件的大小(2 Gb)并没有太大,但是两个都不小,另一个是许多表都有它们中的JPG图像(这就是文件大部分为2Gb的原因)。
另外,转储是在Linux机器上进行的,我正在将其导入Windows,不确定是否会增加问题(我知道应该不会)

现在,该二进制垃圾就是为什么我认为文件中的图像可能是一个问题,但是过去我已经能够从同一托管公司导入类似的转储,所以我不确定这可能是问题所在。

同样,鉴于文件的大小,尝试查看该文件(尤其是3118行)是不可能的(我对使用grep,sed等Linux命令行工具不是很方便)。

该文件可能已损坏,但是我不确定如何检查它。我下载的是一个.gz文件,我用WinRar对其进行了“测试”,它说看起来还可以(我假设gz具有某种CRC)。如果您能想到一种更好的测试方法,我很乐意尝试。

任何想法可能会发生什么/如何克服这个错误?

我并不是特别重视数据,因为我只想将此数据作为开发人员的副本,因此,如果我不得不丢失一些记录,只要架构保持完好无损,我就可以了。

谢谢!
丹尼尔

Answers:


14

因此,我总是使用mysqldump --hex-blob

使用此开关重新转储编码blob的数据库,它将起作用。

您可以尝试使用Windows mysql客户端IDE(如sqlyog或mysql管理员)导入它。它一次为我工作。


我将尝试向主持人询问,让我们看看是否可以这样做。不过,这可能要花费几天的时间:-(--让我感到困惑的是,过去我曾经能够从它们中导入其他二进制转储。可能会是什么吗?
Daniel Magliola 2011年

尝试从mysql管理员而不是从命令行导入
Paul

如果可以在linux上导入,并且可以在使用--hex-blob导出后在Windows上导入,则可以暂时导入linux,然后使用--hex-blob从那里导出。让我知道您是否需要帮助(又名:linux box)。
pupeno 2011年

请参阅下面的@BobC答案,以获取不需要特殊导出的解决方案。
T. Brian Jones

7

您不一定需要使用--hex-blob选项。我刚刚解决了这个问题,问题是我需要将--max_allowed_pa​​cket设置为足够大的值,以容纳要加载的最大数据blob。您的还原命令应类似于:

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

如果使用--hex-blob选项,则将大大增加备份的大小-增大2倍或更多。注意:要还原使用上述命令还原的相同数据,需要在my.ini(cnf)中设置--max_allowed_pa​​cket = 64M并重新启动服务器,并在命令行上将其设置为64M以还原使用以下命令创建的转储--hex-blob选项。


这很好用,可能应该是公认的答案。
T. Brian Jones

2

由于文件太大,仍然可能出现问题,因此请确保将max-allowed-packet设置为某个较高的值(mysql命令的参数)。


1

好的,我今天有这个问题。但是我的问题是,当我意识到备份已损坏时,数据库已经被删除。所以,不--hex-blob适合我!为了解决这个问题,我在PHP中制作了一个小脚本,该脚本将“二进制字符串”转换为十六进制表示形式,其中的值表示方式类似于"_binary '!@{#!@{#'"...

它使用REGEX来解析SQL,虽然这并不完全安全,但它确实为我完成了工作。

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

我希望它可以使我免于头痛!


0

从Linux服务器还原包含二进制数据的转储文件时,我遇到类似的问题。错误就像ERROR 1064 (42000) at line 551: You have an error in your SQL syntax;

此转储文件可以成功导入Linux服务器,但不能成功导入Windows。

我已经尝试使用--hex-bloboption和--max_allowed_packet甚至使用管道而不是.sql文件来传输数据,但是没有运气。

我终于通过使用MySQL Workbench解决了这个问题,生成的命令就像

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"

然后,我--default-character-set=utf8从命令行尝试了一下,并且成功了。希望这会帮助某人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.