mysql - 如何让 liquibase cli 回滚由另一个应用程序启动的 changeSets?
问题描述
我的数据库更改日志如下所示:
<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
<changeSet id="10" author="ez">
<createTable tableName="SomeTable">
<column name="someCol" type="int" />
</createTable>
</changeSet>
<changeSet id="20" author="ez">
<tagDatabase tag="0.0.1"/>
</changeSet>
<changeSet id="30" author="ez">
<createTable tableName="AnotherTable">
<column name="anotherCol" type="int" />
</createTable>
</changeSet>
<changeSet id="40" author="ez">
<tagDatabase tag="0.0.2"/>
</changeSet>
</databaseChangeLog>
我的liquibase.propeties
样子是这样的:
changeLogFile=changelog.xml
url=jdbc:mysql://[redacted]@localhost:3306/[redacted]
当我通过这样的代码运行 liquibase 迁移时:
Liquibase("classpath:db/liquibase/changelog.xml", ClassLoaderResourceAccessor(), db).update(Contexts())
它迁移得很好。
但是当我尝试像这样通过 CLI 回滚时C:\Projects\[redacted]\src\main\resources\db\liquibase>java -jar "C:\Program Files\liquibase\liquibase.jar" --classpath=mysql-connector-java-8.0.22.jar rollbackSQL 0.0.1
,我得到以下 SQL:
-- *********************************************************************
-- Rollback to '0.0.1' Script
-- *********************************************************************
-- Change Log: changelog.xml
-- Ran at: 1/12/21 4:36 PM
-- Against: user@[redacted]@jdbc:mysql://[redacted]@localhost:3306/[redacted]
-- Liquibase version: 4.2.2
-- *********************************************************************
-- Lock Database
UPDATE `[redacted]`.DATABASECHANGELOGLOCK SET `LOCKED` = 1, LOCKEDBY = '[redacted]', LOCKGRANTED = '2021-01-12 16:36:46.435' WHERE ID = 1 AND `LOCKED` = 0;
-- Release Database Lock
UPDATE `[redacted]`.DATABASECHANGELOGLOCK SET `LOCKED` = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1;
如果我重新创建一个空数据库并通过 CLI 运行更新,然后尝试相同的回滚命令,我会得到完整的回滚 SQL:
-- *********************************************************************
-- Rollback to '0.0.1' Script
-- *********************************************************************
-- Change Log: changelog.xml
-- Ran at: 1/12/21 4:40 PM
-- Against: user@[redacted]@jdbc:mysql://[redacted]@localhost:3306/[redacted]
-- Liquibase version: 4.2.2
-- *********************************************************************
-- Lock Database
UPDATE `[redacted]`.DATABASECHANGELOGLOCK SET `LOCKED` = 1, LOCKEDBY = '[redacted]', LOCKGRANTED = '2021-01-12 16:40:20.982' WHERE ID = 1 AND `LOCKED` = 0;
-- Rolling Back ChangeSet: changelog.xml::40::ez
DELETE FROM `[redacted]`.DATABASECHANGELOG WHERE ID = '40' AND AUTHOR = 'ez' AND FILENAME = 'changelog.xml';
-- Rolling Back ChangeSet: changelog.xml::30::ez
DROP TABLE `[redacted]`.AnotherTable;
DELETE FROM `[redacted]`.DATABASECHANGELOG WHERE ID = '30' AND AUTHOR = 'ez' AND FILENAME = 'changelog.xml';
-- Rolling Back ChangeSet: changelog.xml::20::ez
DELETE FROM `[redacted]`.DATABASECHANGELOG WHERE ID = '20' AND AUTHOR = 'ez' AND FILENAME = 'changelog.xml';
-- Release Database Lock
UPDATE `[redacted]`.DATABASECHANGELOGLOCK SET `LOCKED` = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1;
是什么赋予了?如何通过 CLI 回滚我的应用程序所做的更改集?
解决方案
从命令行重复的Liquibase 回滚不起作用
当我从我的应用程序运行它时,DATABASECHANGELOG 中的 FILENAME 是db/liquibase/changelog.xml
. 通过 CLI,我必须在这条路径上运行它,C:\Projects\[redacted]\src\main\resources
而在我liquibase.properties
的路径中运行它changeLogFile=db/liquibase/changelog.xml