达梦 DTS 迁移 MySQL 报错 - 3236:此列列表已索引 解决方案

错误原因【-3236 此列列表已索引】

MySQL 允许同一列上创建多个单列索引;达梦 DM8 不允许:完全相同的列组合,不能建2个单列索引,不管索引名字是否不一样

你这个:

sql 复制代码
CREATE INDEX "IDX_BILL_ORDER"
ON "UPS"."PAY_ORDER"("ORDER_CODE");

含义:在 UPS.PAY_ORDER 的 ORDER_CODE 单列建索引。 达梦目标库里面,ORDER_CODE 这一列已经存在一个单列索引了(可能是DTS已经迁移成功的另一个同名/不同名索引),再次创建就报 -3236

✅ 区分:单列索引 和 联合索引 共存是允许的,只有【完全一样的列集合】不能重复建索引。

第一步:先查询达梦目标库,看看这张表已有的索引

sql 复制代码
SELECT INDEX_NAME,COLUMN_NAME
FROM DBA_IND_COLUMNS
WHERE TABLE_OWNER='UPS' AND TABLE_NAME='PAY_ORDER'
ORDER BY INDEX_NAME,COLUMN_POSITION;

执行后可以看到 PAY_ORDER 表所有索引和字段,确认 ORDER_CODE 已经有索引。

解决方案(3种方案,推荐方案1)

方案1:DTS迁移时,直接忽略这个报错(最常用)

  • 索引已经存在,业务查询不受影响;

  • DTS只把表、数据迁移完成,重复索引报错直接跳过即可;

    注意:迁移完成后核对索引列表,确认ORDER_CODE上至少保留1个索引满足业务查询需求。

方案2:源头MySQL预处理(推荐正式项目)

在源MySQL查看PAY_ORDER表索引:

sql 复制代码
SHOW INDEX FROM PAY_ORDER;

发现 ORDER_CODE 存在多个单列索引,保留一个,多余的删掉:

ini 复制代码
DROP INDEX 多余索引名 ON PAY_ORDER;

清理完重复单列索引,重新跑DTS迁移,就不会报-3236。

方案3:DTS任务设置【过滤重复索引】

新建/编辑DTS迁移任务,选择对象步骤:

  1. 选中 PAY_ORDER 表,点【转换】
  2. 切换到索引页,手动取消勾选重复的索引IDX_BILL_ORDER,不让DTS迁移这个索引;
  3. 继续执行迁移。

补充小坑

  1. 达梦主键本身自带索引:如果ORDER_CODE是主键,那主键索引已经存在,再建单列索引直接报-3236;
  2. 联合索引:比如索引idx_a(ORDER_CODE,STATUS),这个不影响单独建idx(ORDER_CODE)单列索引,不会报3236;
  3. 大小写:达梦字典对象名大写,查询的时候TABLE_OWNER='UPS'大写。

迁移完成后的校验SQL

sql 复制代码
--查看UPS模式PAY_ORDER表所有索引定义
SELECT INDEX_NAME,INDEX_TYPE,UNIQUENESS FROM DBA_INDEXES WHERE OWNER='UPS' AND TABLE_NAME='PAY_ORDER';
相关推荐
核桃er1 小时前
SpringBoot 整合 MyBatis 读取 MySQL 数据——完整开发实录
后端
小卿噢1 小时前
50 万个定时器,四种实现差了 115 倍
后端
用户54817845909501 小时前
CDN 实战:如何用 4 步让网站提速 10 倍
后端
琳达爱分享1 小时前
从单机令牌桶到集群限流:一次配额超发的复盘
后端·算法
用户8662978480081 小时前
Oracle 迁 KingbaseES 全流程:从评估到割接,一个都不能少
数据库
leo在掘金1 小时前
亚马逊开源TorchNeuron:改1行代码跑上Trainium
后端·架构
青岛中阳消防1 小时前
分布式光纤火灾探测器安装常见问题、光缆敷设与光纤熔接解析
后端
弈栈录1 小时前
向量化、召回与重排序服务的实现
后端·面试·架构