【问题标题】:Restoring a MySQL dump with binary blobs使用二进制 blob 恢复 MySQL 转储
【发布时间】:2017-02-21 22:48:41
【问题描述】:

我正在将 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 系统变量增加到其最大值 - 在服务器和客户端上 - 但无济于事。

【问题讨论】:

    标签: mysql backup database-backups mysql-backup


    【解决方案1】:

    如果我没记错的话,您需要将 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]

    【讨论】:

    • 啊,对。我忘了说,我的错。我已经尝试将 max_allowed_pa​​cket 设置为最大值(1073741824)并将相同的值添加到mysql,但没有任何改变。错误消息保持不变。
    【解决方案2】:

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

    由于 JSON 格式的字符串过早终止,恢复到 JSON 列自然会失败。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多