Liquibase无法回滚到指定标签‘1’问题求助
问题分析与解决
问题场景
执行命令:
liquibase rollback --tag=1
出现错误:
Liquibase Open Source 4.27.0 by Liquibase ERROR: Exception Details ERROR: Exception Primary Class: RollbackFailedException ERROR: Exception Primary Reason: Could not find tag '1' in the database ERROR: Exception Primary Source: 4.27.0 Unexpected error running Liquibase: Could not find tag '1' in the database
变更日志(changelog)内容:
-- liquibase formatted sql -- changeset Jota:1 CREATE TABLE IF NOT EXISTS "Tabela1" (); -- changeset Jota:tag_before_alter_table -- tag -- changeset Jota:2 ALTER TABLE "Tabela1" ADD COLUMN IF NOT EXISTS id INT;
在pgAdmin中查看databasechangelog表,存在3条记录,ID分别为1、tag_before_alter_table和2,符合预期。但重置该表后问题仍未解决。
操作错误点
你混淆了Liquibase标签(Tag)和Changeset的ID这两个概念:
- 你执行的
--tag=1是要求回滚到名为"1"的标签,但你的变更日志里从未创建过这个标签 - 变更日志中
-- changeset Jota:tag_before_alter_table下的-- tag是无效写法,Liquibase要求指定标签名称,正确格式是-- tag:标签名(比如-- tag:before_alter_table),否则这条changeset不会生成任何有效标签 - 当前
databasechangelog表中所有记录的TAG字段应该都是空值,自然找不到名为"1"的标签
正确解决方案
方案1:直接回滚到指定Changeset的状态
如果你想回滚到ID为1的changeset执行后的状态(即撤销后面两个changeset的操作),可以用回滚计数命令:
liquibase rollback-count 2
(因为ID为1之后有2个changeset需要回滚)
方案2:添加有效标签后再回滚
- 修改变更日志,为需要标记的位置添加正确的标签:
-- liquibase formatted sql -- changeset Jota:1 CREATE TABLE IF NOT EXISTS "Tabela1" (); -- changeset Jota:tag_before_alter_table -- tag:v1 -- 指定标签名为v1 -- changeset Jota:2 ALTER TABLE "Tabela1" ADD COLUMN IF NOT EXISTS id INT;
- 重新执行更新,让标签生效:
liquibase update
- 此时可以用标签回滚到标记位置:
liquibase rollback --tag=v1
内容的提问来源于stack exchange,提问作者Chaca
相关产品推荐
相关产品推荐

