使用mysqldump备份带有GEOMETRY列的表?

时间:2013-07-05 03:13:57

标签: mysql geometry

我最近创建了一个带有GEOMETRY类型列的MySQL表。

当我使用mysqldump备份表时,它将我的几何列输出为带引号的字符串,包含一些转义字符,如\ 0,还有一些字符看起来像上面的ASCII范围内的原始二进制字节。

当我尝试将转储还原到另一个数据库时,它失败并显示错误:

“无法从您发送到Geometry字段的数据中获取GEOMETRY对象”。

我尝试将--hex-blob添加到我的命令行,但这不会改变输出或解决问题。

我确定有人没有在MySQL中创建数据类型而忘记包含一种备份方式。我错过了什么?

感谢。

4 个答案:

答案 0 :(得分:3)

在我的情况下,此错误专门出现在非空几何列中的几何值。

就我而言,空几何是未知几何的合法情况,所以我通过将列更改为允许空值,然后运行UPDATE ... SET geom = NULL WHERE IsEmpty(geom);

来解决这个问题。

在此之后,我能够重新运行mysqldump并成功将生成的sql导入到单独的数据库中。

(老实说,我不确定空几何值是如何到达那里的 - 我甚至不知道创建空几何值的语法)

答案 1 :(得分:2)

我可以确认在MySQL Workbench中使用导出/导入数据功能时不会发生此问题。 http://www.mysql.com/products/workbench/

答案 2 :(得分:1)

弗兰克,这似乎是mysqldump的一个长期(并且仍然是开放的)错误。请参阅http://bugs.mysql.com/bug.php?id=43544

作为一种解决方法,您可以使用ogr2​​ogr工具将数据导出到shapefile,然后将其导回到数据库中。见http://www.bostongis.com/PrinterFriendly.aspx?content_name=ogr_cheatsheet

答案 3 :(得分:0)

我曾经遇到过这个问题,但是设法使用gzip进行了传递。请检查我的示例命令: 导出:

(defrule temperature
   (av (attribute it-is-cold-inside)
       (value TRUE))
   =>
   (assert (av (attribute it-is-cold-outside)
               (value TRUE))
           (dav (attribute window-is-open)
                (value MAYBE)
                (link temperature))
           (dav (attribute door-is-open)
                (value MAYBE)
                (link temperature)))) 
(defrule one-remaining-dav
   ?dav <- (dav (attribute ?a)
                (value ?v)
                (link ?l))
   (not (and (dav (attribute ?a2)
                  (value ?v2)
                  (link ?l))
             (test (or (neq ?a ?a2) 
                       (neq ?v ?v2)))))
   =>
   (retract ?dav)
   (assert (av (attribute ?a)
               (value TRUE))))

导入:

mysqldump -u root -p db_name | gzip > dump.sql.gz