最近试用了MeterSphere做接口测试平台,感觉使用起来非常方便,最重要的是开源免费!官方文档还是非常详细的,这里我就不多介绍了,感兴趣的同学可以参考:
https://metersphere.io/docs/v2.x/
经过讨论,决定在测试团队推广。由于公司数据库管理策略,数据库必须通过dba 统一管理,所以需要MeterSphere连接外部mysql数据库。数据库迁移过程中主要遇到下面错误:
Caused by: org.flywaydb.core.api.FlywayException: Schema `metersphere` contains a failed migration to version 5 !
接下来我就详细讲述一下,MeterSphere连接外部数据库的操作过程,以及再此过程中解决遇到问题的详细步骤:
修改配置文件
根据官方提示 在/opt/metersphere/.env (该文件是隐藏文件)中修改如下配置,注意标红
# 数据库配置
## 是否使用外部数据库
MS_EXTERNAL_MYSQL=true
## 数据库地址
MS_MYSQL_HOST=mysql
## 数据库端口
MS_MYSQL_PORT=3306
## 数据库库名
MS_MYSQL_DB=metersphere
## 数据库用户名
MS_MYSQL_USER=root
## 数据库密码
MS_MYSQL_PASSWORD=Password123@mysql
然后运行命令
msctl reload
msctl restart
错误现象
自以为会是大功告成,事实则是登录无反应!
查看/opt/metersphere/logs/metersphere/info.log 日志发现问题如下:
Caused by: org.flywaydb.core.api.FlywayException: Schema `metersphere` contains a failed migration to version 5 !
at org.flywaydb.core.internal.command.DbMigrate.migrateGroup(DbMigrate.java:217)
at org.flywaydb.core.internal.command.DbMigrate.lambda$migrateAll$0(DbMigrate.java:141)
at org.flywaydb.core.internal.database.mysql.MySQLNamedLockTemplate.execute(MySQLNamedLockTemplate.java:60)
at org.flywaydb.core.internal.database.mysql.MySQLConnection.lock(MySQLConnection.java:154)
at org.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory.lock(JdbcTableSchemaHistory.java:141)
at org.flywaydb.core.internal.command.DbMigrate.migrateAll(DbMigrate.java:141)
at org.flywaydb.core.internal.command.DbMigrate.migrate(DbMigrate.java:101)
at org.flywaydb.core.Flyway$1.execute(Flyway.java:219)
at org.flywaydb.core.Flyway$1.execute(Flyway.java:170)
at org.flywaydb.core.Flyway.execute(Flyway.java:586)
at org.flywaydb.core.Flyway.migrate(Flyway.java:170)
at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
... 34 common frames omitted
第一反应是 — 怎么会?我明明按照官网链接一步一步执行的啊!
https://metersphere.io/docs/v2.x/installation/offline_installation/
并协调dba搞了个MySQL5.7 ,怎么还会报db迁移到5的错误呢?
Caused by: org.flywaydb.core.api.FlywayException: Schema `metersphere` contains a failed migration to version 5 !
寻求问题解决方案
于是乎找了metersphere的技术支持,解决方案如下:
首先执行下面的脚本
https://raw.githubusercontent.com/metersphere/metersphere/master/backend/src/main/resources/db/migration/V5__schedule.sql
然后修改metersphere_version 表对应版本的的success值为1,
最后执行命令 msclt reload 重启服务即可
1.这里需要注意的是:执行V5__schedule.sql语句一定让dba找一个最高权限的账号来执行,否者需要各种授权,非常的麻烦!
2.如果执行过程中有各种表已经创建,列已经存在的相关消息,直接忽略即可
3. V5__schedule.sql 执行之前已经执行了很多sql操作,这些语句是在执行下面语句时就已经完成了的!换句话说,V5__schedule.sql是基于下面的语句运行之后再运行的!
msctl reload
msctl restart
最后的总结
如果执行sql语句过程中出现了意想不到的问题。建议如下操作:
1. 删掉库metersphere,然后重新创建库metersphere
2. 执行msctl restart
3. 执行语句V5__schedule.sql
4. 修改metersphere_version 表对应版本的的success值为1
5. 执行msclt reload
网友评论