无法恢复几何备份 MySQL 5.7 错误

4

我一直在将一个网站从Mysql 5.6 升级到 5.7。当恢复一个备份文件时,该备份文件已经在Mysql 5.1-5.6下工作了10年(未更改),但在 MySQL 5.7下无法正常使用。

具体来说,几何数据的第一行恢复失败:

ERROR 1416 (22003) at line 1580 Cannot get geometry object from data you send to the GEOMETRY field

所以,这是有效的几何图形,但不再是。

尝试的解决方案:

  • 将mysqldump切换到--hex-blob
  • 在导入之前尝试使用astext( <some geometry> )
  • 手动从备份加载各种几何行,均失败
1个回答

5

看起来 MySQL 5.7 对几何类型的限制比 MySQL 5.6 更严格。因此,在5.6中有效的数据现在在5.7中是无效的

这是 MySQL Bug #76337 的修复,在 MySQL 5.7.8 中发布。

在这种情况下,一个LINESTRING被存储在一个POINT类型的列中。这样做已经工作了近10年,但现在不再适用。将列更改为LINESTRING类型可以解决上述加载错误。

-- The Fix - run on MySQL 5.6 database before Upgrade/Export
ALTER TABLE routes MODIFY COLUMN route_path LINESTRING;

其他故障模式

这个 bug 也会在几何列上表现出来,它们能够保留 NULL 几何图形(但不是官方的 NULL)。MySQL 的 IS NULL 会显示不为空,但在MySQL 5.7下,asText(myGeo) 返回 NULL。将其导出为字符串在 MySQL 5.6 中返回空字符串 ''。因此,从 5.6 输出的 '' 几何图形是 5.7 的无效输入。

解决方法是将其置为空。

-- Convert NULL geometries to actual NULL's
UPDATE myTable SET myGeo = NULL WHERE asText(myGeo) IS NULL;

我也遇到了这个问题!我就是解决不了它!我甚至把它缩小到1条记录,所以我知道它是点数据,而且我知道它不为空。 - Antony D'Andrea
asText在5.6版本中输出'POINT(54.89731 -12.884215)',字段类型在5.6和5.7中都是POINT。但在mysqldump中发生了一些问题。 - Antony D'Andrea
@AntonyD'Andrea - 两年后了!关于ST_IsEmpty,如果几何值无效或为空,则它将返回“1”,如果为null,则返回null,如果有效则返回“0”。 - Anthony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接