Spring Boot集成Liquibase时使用过时changelog是否会意外回滚schema?
问题结论
Liquibase默认不会在无显式回滚请求的情况下执行隐式回滚操作,你描述的场景不会出现schema被自动回滚的问题。
核心逻辑说明
- Liquibase每次启动时会先读取数据库内置的
DATABASECHANGELOG表,这张表会记录所有已经执行成功的changeSet信息 - 加载当前服务内置的changelog列表后,只会比对两边的changeSet记录,默认只会新增执行未在
DATABASECHANGELOG表中记录的changeSet - 若发现
DATABASECHANGELOG表中存在当前changelog没有的已执行记录(也就是你描述的旧版本服务启动、当前changelog只有1、2,数据库已经跑过3的场景),默认会直接抛出异常终止服务启动,不会对现有schema做任何回滚修改。
相关配置说明
Spring Boot集成Liquibase时,控制该校验逻辑的配置项为spring.liquibase.fail-on-missing-change-sets:
- 默认值为
true:遇到上述不匹配场景直接启动失败,旧版本服务无法正常启动,不会修改数据库 - 若手动改为
false:仅会跳过该校验,服务可以正常启动,但依旧不会执行任何隐式回滚操作,仅忽略多出来的changeSet不做处理
注意:默认配置下,自动回滚仅在你显式执行
liquibase rollback系列命令、或者显式配置回滚相关启动参数时才会触发,常规服务启动流程不会触发自动回滚逻辑。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

