我正在使用GIT,Bamboo,Ansible和Liquibase编排自动交付流程。
我在尝试使用Liquibase回滚功能时遇到了一些问题。基本上我有两个不同的地方,比如一个"升级"文件夹和"回滚"夹。即使文件相同,回滚也不起作用。表示:
+ deployment_folder
+ update
- changeset-master.xml
- changeset-1.0.0.xml
- changeset-1.0.1.xml
+ rollback
- changeset-master.xml
- changeset-1.0.0.xml
- changeset-1.0.1.xml
文件内容完全相同。
运行liquibase更新和标记很好:
$>liquibase --username=USR --password=*** --classpath=./ojdbc7.jar --driver=oracle.jdbc.driver.OracleDriver --url=jdbc:oracle:thin:@host:port:SID --changeLogFile=update/changeset-master.xml update
$>liquibase --username=USR --password=*** --classpath=./ojdbc7.jar --driver=oracle.jdbc.driver.OracleDriver --url=jdbc:oracle:thin:@host:port:SID --changeLogFile=update/changeset-master.xml tag 1.0.0
$>liquibase --username=USR --password=*** --classpath=./ojdbc7.jar --driver=oracle.jdbc.driver.OracleDriver --url=jdbc:oracle:thin:@host:port:SID --changeLogFile=update/changeset-master.xml update
$>liquibase --username=USR --password=*** --classpath=./ojdbc7.jar --driver=oracle.jdbc.driver.OracleDriver --url=jdbc:oracle:thin:@host:port:SID --changeLogFile=update/changeset-master.xml tag 1.0.1
但是,当尝试使用 rollback 文件夹中的更改集主服务器从1.0.1回滚到1.0.0时,它会显示" Liquibase Rollback Successful"但是这些变化没有回滚。 rollbackSQL命令也不显示除DATABASECHANGELOGLOCK更新之外的任何相关SQL语句。
$>liquibase --username=USR --password=*** --classpath=./ojdbc7.jar --driver=oracle.jdbc.driver.OracleDriver --url=jdbc:oracle:thin:@host:port:SID --changeLogFile=rollback/changeset-master.xml rollback 1.0.0
看起来文件必须完全相同(对于我认为的校验和),在我的情况下这是一个show blocker,我必须不断从我的源代码控制系统中提取版本,所以文件永远不会是&# 34;相同",尽管它们具有相同的内容。有没有办法在Liquibase中禁用此验证?目前我正在使用Liquibase 3.4.2。
答案 0 :(得分:0)
Liquibase回滚不能以这种方式工作,您需要在< rollback>中指定回滚指令。脚本的一部分并使用rollback命令执行它:http://www.liquibase.org/documentation/rollback.html
UPD:Liquibase使用基于变更集文件名的id,更改id和作者ID来识别更改。如果您从文件f1.xml应用<change id="1" author="dbf">...</change>
,那么'virtual'id是<f1.xml, 1, dbf>
。当您使用相同的内容运行f2.xml进行回滚时,它计算的id为<f2.xml, 1, dbf>
,因此它与第一个id不匹配,并且不会回滚任何内容。