使用二进制blob恢复MySQL转储

时间:2017-02-21 22:48:42

标签: mysql backup database-backups mysql-backup

我正在将MySQL数据库从现在无法访问的服务器移动到新服务器。转储包含表,而这些表又包含二进制blob,这似乎会导致MySQL命令行客户端出现问题。尝试还原数据库时,出现以下错误:

ERROR at line 694: Unknown command '\''.

我检查了发生错误的行,发现它是一个巨大的插入语句(长度约为900k个字符),似乎将二进制blob插入表中。

现在,我发现似乎与我有关的these two个问题。但是,这两个答案都证明不能解决我的问题。添加--default-character-set=utf8甚至--default-caracter-set=latin1没有改变任何内容,因为无法再访问源数据库服务器,因此无法使用--hex-dump创建转储。

有什么办法可以通过MySQL命令行客户端恢复此备份吗?如果是,我需要做什么?

如果您需要任何其他信息,请与我们联系。

提前致谢。

编辑:我使用的是MySQL 5.6.35。此外,除了上面提到的尝试之外,我已经尝试在服务器和客户端上将max_allowed_packet系统变量增加到其最大值 - 但无济于事。

2 个答案:

答案 0 :(得分:0)

如果我没记错的话,您需要将my.cnf中的max_allowed_pa​​cket设置为足够大的值以容纳转储文件中最大的数据blob,然后重新启动MySQL服务器。

然后,您可以使用像这样的恢复命令:

mysql --max_allowed_packet=64M  < your_dumpfile.sql

更多信息: [https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_max_allowed_packet]

答案 1 :(得分:0)

没有解决方案,只是确认我在包含长JSON字符串的“text”字段类型中看到了相同的行为。 MySQLdump生成的SQL(备份)文件有一个INSERT语句,它将该特定文本字段的长度截断为“约”64K(有许多转义引号/双引号和各种UTF-8字符) - 不发出警告发生了这种截断。

当然,由于JSON格式化字符串的提前终止,还原到JSON列失败。

在这种情况下奇怪的是,备份表中的列被定义为TEXT,实际上应该限制为64 KB。在预感中,我将备份表的架构更改为MEDIUMTEXT。之后,MySQLdump不再在INSERT语句中截断该字符串,超出64K。

似乎MySQLdump不只是输出整个列,而是截断到它认为最大字符串长度应该基于模式信息的任何内容,并且在截断时不会发出警告。