Yapi数据库迁移后无法新建的问题解决方案
1.场景
在一个新的服务器环境全新安装了yapi后,需要将原有的已经在使用的yapi系统里的数据导入的新装的服务器里。
即将A服务器上mongodb里yapi库的数据迁移到B服务器上的mongodb的yapi库里。
2.问题
迁移后再yapi中执行分组/项目/分类/接口的新建操作时,可能会遇到服务器错误的提示,看服务器端终端日志,原因是数据库主键_id
重复造成的。
3. 原因
- 由于
mongodb
本身没有主键自动递增的机制,它默认只是生成一个随机的objectid
, - 所以 yapi 在程序里自己生成了递增的
_id
字段, - 每次生成新的
_id
后,就会把这个值存入IdentityCounter
这个表里, - 下次再生成新的
_id
时就会以这个表里的count值为基准进行递增。
导入数据的时候,IdentityCounter
这个表的数据没有导入成功,就会造成生成新纪录时的_id
基准值是从1重新开始的,就会和导入的数据的_id
重复,继而报错。
4. 解决办法
4.1 重试重新导入IdentityCounter
表的数据
如果导入不成功,则尝试下面办法。
4.2 更新IdentityCounter
表
以interface
表为例,先查询到导入后interface
表中 _id
的最大值的那条记录,记录下这条记录的_id
值。
// mongodb->use yapi;
> db.interface.find().sort({_id: -1}).skip(0).limit(1);
将这条id值更新到 IdentityCounter
这个表中:
> db.interface.update({_id: $a} ,{$set: {count: $b}});
其中:
$a
:IdentityCounter
表中interface
对应的那条记录的_id
值$b
:上面查到的最大id值。