Liquibase配合Gradle运行MongoDB迁移报错及changelog校验问题咨询
问题诱因
从报错日志的关键异常com.mongodb.MongoCommandException: Command failed with error -1: 'unknown option to collMod: validationAction'可以直接定位问题根源:
你使用的Liquibase MongoDB扩展版本和MongoDB服务器版本不兼容。validationAction是MongoDB 3.2版本才新增的集合校验参数,Liquibase MongoDB扩展在初始化DATABASECHANGELOGLOCK、DATABASECHANGELOG两个系统集合时,会调用collMod命令给集合添加校验规则,如果你运行的MongoDB服务器版本低于3.2,就无法识别这个参数,抛出对应错误。
这个错误发生在锁服务初始化阶段,还没有到执行你自定义的changelog逻辑的步骤,所以删除databasechangeloglock集合完全无法解决问题,因为集合重新初始化时还是会触发相同的collMod命令调用。
解决方案
- 方案1:升级MongoDB服务器到3.2或更高版本,和你当前使用的Liquibase MongoDB扩展版本适配。
- 方案2:如果你无法升级MongoDB版本,降级Liquibase MongoDB扩展到匹配你当前MongoDB版本的兼容版本,参考扩展发布说明选择对应版本即可。
- 方案3:在Liquibase的活动配置中添加参数
liquibase.mongodb.disableCollectionValidation=true,关闭扩展自动给系统集合添加校验规则的逻辑,绕开collMod命令调用,配置示例如下:
liquibase { activities { main { changeLogFile 'liquibase/changelogs/changelog-master.json' url 'mongodb://r**t:pas***d@localhost:27017/db?authSource=admin' driver 'liquibase.ext.mongodb.database.MongoClientDriver' // 新增关闭集合校验的参数 liquibase.mongodb.disableCollectionValidation = true } }
changelog JSON校验方法
- 基础校验可直接使用Liquibase自带的
validate命令,Gradle环境下执行./gradlew liquibaseValidate即可,该命令会自动校验changelog文件的JSON语法合法性、变更集ID/作者标识唯一性、文件引用路径正确性、变更类型参数完整性等问题,支持MongoDB专属变更类型的校验。 - 若要校验MongoDB DML脚本的逻辑合法性,可先将DML语句在本地测试环境的Mongo Shell中执行验证,确认执行结果符合预期后再写入changelog文件。
- 可在测试环境搭建和生产版本完全一致的MongoDB实例,提前执行
./gradlew liquibaseUpdate执行全量迁移,提前发现版本兼容、语法错误、数据冲突等问题。
内容的提问来源于stack exchange,提问作者diaop
相关产品推荐
相关产品推荐

