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

Jos*_*ust 4 mysql geometry

我一直在将网站从 Mysql 升级5.65.7. 当从在 Mysql 5.1-5.6 下工作了 10 年(未更改)的备份恢复时mysqldump,它在 MySQL 下不再工作5.7

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

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

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

尝试的补救措施:

  • 将 mysqldump 切换到--hex-blob
  • astext( <some geometry> )导入前尝试使用
  • 从备份中加载各种几何行的疲倦的手,全部失败

Jos*_*ust 5

看起来MySQL 5.7几何类型比MySQL 5.6. 因此,在 5.6 中有效的数据现在在 5.7 中无效

这是MySQL 5.7.8版本中对MySQL Bug #76337 的修复。

在本例中, aLINESTRING存储在类型为 的列中POINT。这种方法持续了近十年,但之后就不再有效了。将列更改为类型LINESTRING修复了上述加载错误。

-- The Fix - run on MySQL 5.6 database before Upgrade/Export
ALTER TABLE routes MODIFY COLUMN route_path LINESTRING;
Run Code Online (Sandbox Code Playgroud)

其他故障模式

这个错误也出现在几何列上,它们能够保留 NULL 几何图形(但不是正式的 NULL)。MySQLIS NULL会说 not null,但在MySQL 5.7asText( myGeo )返回。将这些导出到 MySQL 5.6 中的字符串返回空字符串。因此,5.6 的几何输出对于 5.7 来说是无效的输入。NULL''''

解决办法是取消这些。

-- Convert NULL geometries to actual NULL's
UPDATE myTable SET myGeo = NULL WHERE asText(myGeo) IS NULL;
Run Code Online (Sandbox Code Playgroud)