如何兼容Mysql的空间类型和函数

【TiDB 使用环境】Poc
【TiDB 版本】8.0.11-TiDB-v8.5.4
【操作系统】Ubuntu 22.04.5 LTS
【部署方式】机器部署(16核 62G)
【集群数据量】100G
【集群节点数】3
【问题复现路径】通过dm,进行mysql到tidb的数据迁移,geometry类型的字段会报错导致建表失败、同步失败。
【遇到的问题:问题现象及影响】mysql侧有很多geometry类型的字段,后端代码sql中也有许多空间类型函数,在检查同步task时只有warning没有erro,但是执行task时就报错了。
【资源配置】

【复制黏贴 ERROR 报错的日志】

dm tiup dmctl --master-addr 127.0.0.34:8261 query-status task3.yaml
Starting component dmctl: /root/.tiup/components/dmctl/v8.5.4/dmctl/dmctl --master-addr 127.0.0.34:8261 query-status task3.yaml
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "sourceStatus": {
                "source": "mysql-01",
                "worker": "dm-127.0.0.36-8262",
                "result": null,
                "relayStatus": null
            },
            "subTaskStatus": [
                {
                    "name": "biz_enterprise_parking_lot",
                    "stage": "Paused",
                    "unit": "Load",
                    "result": {
                        "isCanceled": false,
                        "errors": [
                            {
                                "ErrCode": 34019,
                                "ErrClass": "load-unit",
                                "ErrScope": "internal",
                                "ErrLevel": "high",
                                "Message": "",
                                "RawCause": "[Lightning:Restore:ErrInvalidSchemaStmt]invalid schema statement: 'CREATE TABLE `biz_enterprise_parking_lot` (\n`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',\n`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '停车场名称',\n`type` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '停车场类型(0市直 1国有企业)',\n`code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '停车场编码',\n`category_id` bigint DEFAULT NULL COMMENT '停车场类型外键',\n`enterprise_ids` bigint DEFAULT NULL COMMENT '企业单位ids',\n`enterprise_names` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '企业单位名称(多个)',\n`total_spot` int DEFAULT NULL COMMENT '总车位数',\n`used_spot` int DEFAULT NULL COMMENT '使用车位数',\n`open_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '开放时段',\n`location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '经纬度',\n`location_geo` geometry DEFAULT NULL,\n`address_detail` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '详细地址',\n`owner` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '经营者',\n`phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式',\n`owner_user_id` bigint DEFAULT '0' COMMENT '停车场超管用户 ID',\n`create_time` datetime DEFAULT NULL,\n`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n`update_time` datetime DEFAULT NULL,\n`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0',\n`opening_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n`tag_ids` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签id,多个用英文逗号分隔',\nPRIMARY KEY (`id`) USING BTREE\n) ENGINE=InnoDB AUTO_INCREMENT=11194 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='企业单位停车场';': line 13 column 25 near \"geometry DEFAULT NULL,\n`address_detail` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '详细地址',\n`owner` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '经营者',\n`phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式',\n`owner_user_id` bigint DEFAULT '0' COMMENT '停车场超管用户 ID',\n`create_time` datetime DEFAULT NULL,\n`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n`update_time` datetime DEFAULT NULL,\n`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0',\n`opening_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n`tag_ids` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签id,多个用英文逗号分隔',\nPRIMARY KEY (`id`) USING BTREE\n) ENGINE=InnoDB AUTO_INCREMENT=11194 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='企业单位停车场';\" ",
                                "Workaround": ""
                            }
                        ],
                        "detail": null
                    },
                    "unresolvedDDLLockID": "",
                    "load": {
                        "finishedBytes": "0",
                        "totalBytes": "0",
                        "progress": "0.00 %",
                        "metaBinlog": "(binlog.000003, 540)",
                        "metaBinlogGTID": "5f6fb16f-b5e3-11ee-8ec9-fa163e99a1c2:1-457883955",
                        "bps": "0"
                    },
                    "validation": null
                }
            ]
        }
    ]
}

【其他附件:截图/日志/监控】

1 个赞

我了解tidb是不兼容空间类型函数的,我该如何通过其他手段来实现对空间类型字段和相关函数的支持呢?

将空间函数逻辑从同步 SQL 中移除,改为:① 源库侧先通过视图 / 存储过程将 geometry 转为 WKT 字符串(ST_AsText(geom_field) );② 同步时仅同步字符串类型字段;③ 目标库侧再通过 ST_GeomFromText(wkt_str) 还原为 geometry 类型。

目标侧是tidb,tidb是不支持像ST_GeomFromText(wkt_str)这种空间函数的啊

https://docs.pingcap.com/zh/tidb/stable/mysql-compatibility/#不支持的功能特性 官方文档上有说明

我知道啊,但有没有“曲线救国”的办法呢?

没有实际操作过,看看有没有大神吧

一不支持空间函数,二不支持自定义函数,我觉得从数据库层面是无法实现这个要求的。

不知道能不能通过修改配置文件的方式来试一下

支持不了的,不用想这个问题了

vector
全文索引
存储过程,触发器,udf
这些会在企业版支持,但是空间函数,目前没有计划

  1. 源库将 geometry 转 WKT 字符串同步至 TiDB 的 varchar 字段;
  2. 空间函数逻辑迁移到应用侧,调用第三方 GIS 库(如 GeoTools)实现空间计算,避开 TiDB 的兼容性限制。

1、不支持空间函数
2、不支持自定义函数

国产数据库最好不要用函数存储过程, 业务逻辑都用程序去实现,这样以后迁移也方便

应用迁移成本很高吧?最后的方案能否分享下?

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。