【发布时间】:2017-11-01 11:18:00
【问题描述】:
我目前正在试用 liquibase,但在非常具体的场景中遇到回滚问题。
我已经实现了一个 Spring listener bean 来从我的 web 应用程序中启动 liquibase,其想法是部署最新的 web 代码和数据库后端,您只需部署 web 代码,启动应用程序,liquibase 将在任何需要的环境中运行数据库更改。 (更改日志文件驻留在网络应用程序中)
到目前为止一切顺利。这一切都很好。尝试回滚时会出现问题。所以我试图实现的场景是,要回滚应用程序版本,我应该简单地部署旧版本的 Web 应用程序(使用旧版本的变更日志文件),然后执行回滚到以前的状态数据库也是如此。
这需要在应用程序属性文件中捕获回滚标记并将更改日志复制到 Web 服务器可以访问以运行回滚的位置(因为如果我在应用程序中的更改日志将不再具有要回滚的更改集'正在部署旧版本)。
问题是尽管没有抛出错误,但没有发生回滚步骤。我怀疑当 liwuibase 尝试从 Web 服务器上复制的更改日志中回滚更改时,不知何故 MD5 校验和不同,因此它不会回滚它们。
这是一个示例更改日志。我提供了一个logicalFilePath,并且还尝试使用validCheckSum 来确保没有校验和失败。但是,回滚仍然没有发生。
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"
logicalFilePath="/liquibase/changelogs/sprint2/changelog.xml">
<changeSet id="5" author="Craig" runOnChange="true">
<validCheckSum>*</validCheckSum>
<comment>liquibase_proc.sql</comment>
<sqlFile path="liquibase_proc.sql" relativeToChangelogFile="true"
endDelimiter="\nGO" />
<rollback>
<sql>drop procedure liquibase_proc</sql>
</rollback>
</changeSet>
<changeSet id="BUILD-1.2" author="build-auto">
<validCheckSum>*</validCheckSum>
<tagDatabase tag="BUILD-1.2" />
</changeSet>
</databaseChangeLog>
有人有什么想法吗?仅供参考,复制的变更日志位于 unix 框上,而原始版本位于 windows 上,这会产生影响吗?
【问题讨论】:
-
能否将liquibase日志级别设置为debug并包含生成的日志文件?
-
好的,我发现了这个问题。我试图将 Liquibase 实例的更改日志位置从一个位置更改到另一个位置。如此有效,如果在新更改中运行,则使用 Web 应用程序中的更改日志,如果运行回滚,则使用 Web 服务器上的更改日志。但是,尝试更改 Liquibase 实例的更改日志位置并没有按预期工作。解决方案是拥有两个独立的 Liquibase 实例,每个更改日志位置一个。
标签: java spring liquibase rollback