PostgreSQL+PostGIS恢复dump文件提示WKB结构大小不匹配如何解决
错误原因
这个报错本质是导入的WKB(十六进制编码的空间几何二进制)格式不符合当前PostGIS版本的解析规则,常见诱因包括:
- 导出dump的源库PostGIS版本高于当前3.1.2版本,生成的WKB包含低版本不支持的编码规则
- 导出过程中网络波动、磁盘IO异常导致单条空间数据损坏
- 导入时表的
object_gt列SRID配置和WKB内置的SRID不匹配
解决方案
方案1:临时关闭WKB严格校验完成导入(优先推荐)
- 第一步:先仅导入数据库结构,不导入数据,执行命令:
pg_restore -d 你的目标库名 --no-data 你的dump文件路径 - 第二步:登录目标库,执行参数配置临时关闭严格校验:
-- 关闭WKB严格解析规则 SET postgis.strict_wkb_parsing = off; -- 若仍报错可额外关闭几何合法性校验 SET postgis.validate_geometry = off;
- 第三步:单独导入
tn_ctrln表数据,执行命令:pg_restore -d 你的目标库名 --data-only --table=tn_ctrln 你的dump文件路径 - 第四步:导入完成后修复损坏的几何数据,再恢复校验规则:
-- 修复所有非法几何 UPDATE tn_ctrln SET object_gt = ST_MakeValid(object_gt) WHERE ST_IsValid(object_gt) = false; -- 恢复默认校验规则 RESET postgis.strict_wkb_parsing; RESET postgis.validate_geometry;
方案2:过滤损坏行优先恢复大部分数据
如果方案1仍报错,说明该条数据已经完全损坏无法解析,可以先跳过该行:
- 从dump文件中提取
tn_ctrln表的所有文本数据,保留除第966215行之外的所有数据,导出为单独的文本文件 - 执行批量导入:
psql -d 你的目标库名 -c "\copy tn_ctrln from '清理后的文本文件路径' with (format text)" - 后续可从源库单独导出该条损坏行的合法数据补入目标库
注意事项
- 导入前请尽量保证目标库PostGIS版本和源库导出时的版本一致,若源库为PostGIS 3.2及以上版本,建议先将目标PostGIS升级到对应版本再导入,避免兼容性问题
- 所有操作前请提前备份空的目标库结构,避免操作失误导致重复创建结构出错
- 导入完成后必须执行
SELECT * FROM tn_ctrln WHERE ST_IsValid(object_gt) = false;检查所有空间数据合法性,避免后续空间查询出现异常
内容的提问来源于stack exchange,提问作者Korean Jr.developer
相关产品推荐
相关产品推荐

