基于Spring的项目如何在无直接数据库权限的前提下解锁Liquibase锁
Liquibase无数据库修改权限解锁方案
方案1:通过Spring配置临时开启启动自动释放锁
你使用的Liquibase 4.3.1版本原生支持启动时自动释放锁的配置,不需要手动修改数据库表,操作如下:
- 在应用的
application.yml中添加如下配置:
spring: liquibase: release-locks-on-startup: true
如果使用application.properties则添加:
spring.liquibase.release-locks-on-startup=true
- 提交配置后通过Jenkins部署启动一次,应用启动时会自动执行锁释放逻辑,成功启动后务必删除该配置,避免多实例并发部署时出现变更冲突。
方案2:在Jenkins部署流程中加入Liquibase释放锁命令
如果配置方案不生效,可以在Jenkins的应用启动步骤前新增Liquibase命令执行步骤:
- 直接复用应用现有的数据库连接参数(地址、用户名、密码、驱动),执行命令:
liquibase release-locks
- 该命令只会清除
DATABASECHANGELOGLOCK表中的锁标记,不会修改任何业务数据,也不会改动已执行的变更记录,执行完成后再启动应用即可。
方案3:新增临时配置类强制释放锁
如果上述两种方案都无法生效,可以新增临时Spring配置类,在Liquibase初始化前强制释放锁:
import liquibase.Liquibase; import liquibase.database.Database; import liquibase.integration.spring.SpringLiquibase; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class LiquibaseUnlockConfig { @Bean public SpringLiquibase liquibase(DataSource dataSource) { SpringLiquibase liquibase = new SpringLiquibase() { @Override protected Liquibase createLiquibase(Database database) throws Exception { Liquibase lb = super.createLiquibase(database); // 强制释放所有已存在的锁 lb.getDatabase().getLockService().forceReleaseLock(); return lb; } }; liquibase.setDataSource(dataSource); // 替换为你项目实际的changelog路径 liquibase.setChangeLog("classpath:db/changelog/db.changelog-master.xml"); return liquibase; } }
- 提交该类后部署一次,成功启动后删除该配置类即可,全程不会改动业务数据。
注意事项
- 所有方案均只会操作Liquibase自带的锁表,不会修改业务表数据,也不会重复执行已经标记为已执行的变更脚本,不会出现数据丢失问题
- 锁释放完成后必须删除临时添加的配置、代码或者Jenkins步骤,避免多实例同时部署时出现变更并发执行的风险
内容的提问来源于stack exchange,提问作者Khilarian
相关产品推荐
相关产品推荐

