暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

磐维数据库使用dtp迁移出现Incorrect table definition, auto increment column must be defined as a key错误

原创 杨健超 云和恩墨 2024-12-13
621

中国移动磐维数据库(ChinaMobileDB),简称“磐维数据库”(CMDB)。是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品。

其产品内核能力基于华为 OpenGauss 开源软件,并进一步提升了系统稳定性。

磐维数据库dtp迁移工具提供了自动化、流程化的解决方案,实现了一键式数据迁移。这种高效的数据迁移方式不仅提高了迁移数据的效率,也降低了操作难度,为用户带来了极大的便利。

一、问题背景

在一次从MySQL数据库迁移数据到磐维数据库时,出现Incorrect table definition, auto increment column must be defined as a key.的报错,同时由于UNSIGNED语法导致数据类型改变,从而导致数据迁移失败,部分迁移数据不可用,导致应用程序无法连接磐维数据库。

迁移工具版本:PanWeiDB_V2.0-dtp3.0.0_B01

数据库版本:PanWeiDB_V2.0-S3.0.2_B02

数据库兼容模式:B

报错信息如下:Incorrect table definition, auto increment column must be defined as a key.

二、问题分析

我们尝试把建表语句拿到数据库后台执行,结果如下:

报错与dtp前端页面一致,此时我想到,之前MySQL迁移磐维2.0.3时没有出现此问题,所以我把该建表语句拿到磐维2.0.3的环境当中进行试验,结果如下:

果然,我们看到在磐维2.0.3中并不会出现以上报错。

我们可以看到在MySQL原始语句中,创建表的语句中就有对自增列的主键定义,而在磐维中,建表的语句中没有对自增列的主键定义,而是把主键定义写到了约束中。但是此时表没有创建成功,从而导致了约束也创建失败,这就造成了迁移失败的情况。

我通过查询手册发现在该版本的dtp当中有如下特性:

这就导致了此次问题的出现。并且由于unsigned关键字的原因,导致迁移后被unsigned关键字修饰的列的数据类型发生了改变,由原来的bigint类型变成了numeric(20),这就造成了表结构的改变,导致了业务程序无法连接数据库。

三、问题解决

首先,针对表中自增列需要设置为主键而迁移失败的问题,解决办法是手动在建表语句中,添加对自增列的主键定义。修改一个SQL之后试验发现,可以成功创建对象,证明这个方法是行的通的。由于报错较多,一个一个修改不太现实,我们选择修改迁移规则,进行批量添加。

其次,针对unsigned关键字的原因,导致迁移后被unsigned关键字修饰的列的数据类型发生了改变的问题,同样通过修改迁移规则配置,进行解决。但是进行操作的过程中发现,迁移规则设置成数据类型时,无法识别unsigned,只有将迁移规则设置成关键字时才能识别unsigned,这是我们需要注意的点。

通过迁移规则的修改,在迁移的过程中会对相关的SQL进行一个批量的操作,最后业务数据迁移成功,业务验证数据正常,问题得到解决。




「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论