Liquibase 回滚不适用于 "Liquibase Rollback Successful"
Liquibase rollback not working with "Liquibase Rollback Successful"
拜托,你能帮我做回滚操作吗?这是某种魔法——liquibase 向我报告了成功的回滚操作,但没有任何变化。
我们使用sql格式SQL。例如我有 3 个文件:
CASE-0-1.sql:
--liquibase formatted sql
--changeset CASE-0-1:1 failOnError:true
CREATE TABLE tt1(
cc1 INT(11));
--rollback DROP TABLE tt1;
--rollback CREATE TABLE tr1(
--rollback cr1 INT(20));
CASE-0-2.sql:
--liquibase formatted sql
--changeset CASE-0-2:1 failOnError:true
CREATE TABLE tt2(
cc2 INT(11));
--rollback DROP TABLE tt2;
--rollback CREATE TABLE tr2(
--rollback cr2 INT(20));
CASE-0-3.sql:
--liquibase formatted sql
--changeset CASE-0-3:1 failOnError:true
CREATE TABLE tt3(
cc3 INT(11));
--rollback DROP TABLE tt3;
--rollback CREATE TABLE tr3(
--rollback cr3 INT(20));
我在进行任何更改之前标记数据库:
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--logFile=0state.tag.log --username=trunk --password=Trunk \
tag "0state"
之后,我在每个文件应用后应用文件和 TAG 数据库:
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--changeLogFile=CASE-0-1.sql --logFile=CASE-0-1.sql.update.log --username=trunk --password=Trunk \
update
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--logFile=CASE-0-1.sql.tag.log --username=trunk --password=Trunk \
tag "CASE-0-1"
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--changeLogFile=CASE-0-2.sql --logFile=CASE-0-2.sql.update.log --username=trunk --password=Trunk \
update
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--logFile=CASE-0-2.sql.tag.log --username=trunk --password=Trunk \
tag "CASE-0-2"
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--changeLogFile=CASE-0-3.sql --logFile=CASE-0-3.sql.update.log --username=trunk --password=Trunk \
update
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--logFile=CASE-0-3.sql.tag.log --username=trunk --password=Trunk \
tag "CASE-0-3"
结果:
[root@mysql]# mysql -e "SELECT ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, DESCRIPTION, COMMENTS, TAG \
> FROM DATABASECHANGELOG;" liquibase_test
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
| ID | AUTHOR | FILENAME | DATEEXECUTED | ORDEREXECUTED | EXECTYPE | DESCRIPTION | COMMENTS | TAG |
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
| 1506498093527 | liquibase | liquibase-internal | 2017-09-27 10:41:33 | 1 | EXECUTED | empty | | 0state |
| 1 | CASE-0-1 | CASE-0-1.sql | 2017-09-27 10:41:57 | 2 | EXECUTED | sql | | CASE-0-1 |
| 1 | CASE-0-2 | CASE-0-2.sql | 2017-09-27 10:42:08 | 3 | EXECUTED | sql | | CASE-0-2 |
| 1 | CASE-0-3 | CASE-0-3.sql | 2017-09-27 10:42:12 | 4 | EXECUTED | sql | | CASE-0-3 |
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
[root@mysql]# mysql -e "SHOW TABLES;" liquibase_test
+--------------------------+
| Tables_in_liquibase_test |
+--------------------------+
| DATABASECHANGELOG |
| DATABASECHANGELOGLOCK |
| tt1 |
| tt2 |
| tt3 |
+--------------------------+
现在,让我们尝试回滚:
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--changeLogFile=CASE-0-2.sql --logFile=CASE-0-2.sql.rollback.log --username=trunk --password=Trunk \
rollback "CASE-0-2"
Liquibase Rollback Successful
看起来一切正常,但未执行回滚:
[root@mysql]# mysql -e "SELECT ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, DESCRIPTION, COMMENTS, TAG \
> FROM DATABASECHANGELOG;" liquibase_test
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
| ID | AUTHOR | FILENAME | DATEEXECUTED | ORDEREXECUTED | EXECTYPE | DESCRIPTION | COMMENTS | TAG |
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
| 1506498093527 | liquibase | liquibase-internal | 2017-09-27 10:41:33 | 1 | EXECUTED | empty | | 0state |
| 1 | CASE-0-1 | CASE-0-1.sql | 2017-09-27 10:41:57 | 2 | EXECUTED | sql | | CASE-0-1 |
| 1 | CASE-0-2 | CASE-0-2.sql | 2017-09-27 10:42:08 | 3 | EXECUTED | sql | | CASE-0-2 |
| 1 | CASE-0-3 | CASE-0-3.sql | 2017-09-27 10:42:12 | 4 | EXECUTED | sql | | CASE-0-3 |
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
[root@mysql]# mysql -e "SHOW TABLES;" liquibase_test
+--------------------------+
| Tables_in_liquibase_test |
+--------------------------+
| DATABASECHANGELOG |
| DATABASECHANGELOGLOCK |
| tt1 |
| tt2 |
| tt3 |
+--------------------------+
如您所见 - 我们拥有相同的 table 集,没有 table 掉落,没有创建额外的 table。
回滚日志文件中的内容:
[root@mysql]# cat CASE-0-2.sql.rollback.log:
DEBUG 27.09.17 10:53: liquibase: Connected to trunk2@127.0.0.1@jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true
DEBUG 27.09.17 10:53: liquibase: Setting auto commit to false from true
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: select count(*) from liquibase_test.DATABASECHANGELOGLOCK
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: select count(*) from liquibase_test.DATABASECHANGELOGLOCK
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: SELECT LOCKED FROM liquibase_test.DATABASECHANGELOGLOCK WHERE ID=1
DEBUG 27.09.17 10:53: liquibase: Lock Database
DEBUG 27.09.17 10:53: liquibase: Executing UPDATE database command: UPDATE liquibase_test.DATABASECHANGELOGLOCK SET LOCKED = 1, LOCKEDBY = 'mysql-gigantic-dummy-dvaco-trunk-28.aws.srv (172.29.13.83)', LOCKGRANTED = '2017-09-27 10:53:26.625' WHERE ID = 1 AND LOCKED = 0
INFO 27.09.17 10:53: liquibase: Successfully acquired change log lock
DEBUG 27.09.17 10:53: liquibase: Computed checksum for 1506498806750 as 17f1742877fc068db5453ca9db9d60e3
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: SELECT MD5SUM FROM liquibase_test.DATABASECHANGELOG WHERE MD5SUM IS NOT NULL LIMIT 1
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: select count(*) from liquibase_test.DATABASECHANGELOG
INFO 27.09.17 10:53: liquibase: Reading from liquibase_test.DATABASECHANGELOG
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: SELECT * FROM liquibase_test.DATABASECHANGELOG ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC
DEBUG 27.09.17 10:53: liquibase: CASE-0-2.sql: CASE-0-2.sql::1::CASE-0-2: Computed checksum for inputStream as 80fa2b893f3b36ef72cf796a9ce61189
DEBUG 27.09.17 10:53: liquibase: CASE-0-2.sql: CASE-0-2.sql::1::CASE-0-2: Computed checksum for 7:80fa2b893f3b36ef72cf796a9ce61189: as 6c11f0a414ae9865f42a220f71f1e3d1
DEBUG 27.09.17 10:53: liquibase: Release Database Lock
DEBUG 27.09.17 10:53: liquibase: Executing UPDATE database command: UPDATE liquibase_test.DATABASECHANGELOGLOCK SET LOCKED = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1
INFO 27.09.17 10:53: liquibase: Successfully released change log lock
我检查了不同的变体、不同的 liquibase 文件格式、不同的命令行选项 - 没用。 Liquibase 总是说 "Liquibase Rollback Successful",但什么都不做。
请帮忙。可能有人使用 sql 或其他格式的回滚操作?错在哪里?我做错了什么?它是否可以使用 liquibase 功能?
希望您仍然对帮助感兴趣,但据我所知,您没有包含 CASE-0-3 SQL 脚本,因此 liquibase 不知道 CASE 之外应用的更改-0-2 您提供的标签 - 因此它无法回滚。
我的团队所做的是创建一个更强大的 changelog.xml
来引用我们的 .sql 脚本,而不是使用 .sql 脚本作为更新日志文件。
如果有帮助请告诉我!
我解决了这个问题并发现它有效。问题如下:
在 migration/update 期间,--changeLogFile 参数获取文件名并在 --classpath 文件夹中找到它。然后它在其日志 table 中存储具有完整路径的文件名。
但是在回滚时同样不起作用。您需要在 --changeLogFile 中提供文件名的完整路径。它只是将此参数与日志 table 进行比较。在这种情况下,它不使用类路径在其日志中进行搜索之前准备结束到 changeLogFile table.
拜托,你能帮我做回滚操作吗?这是某种魔法——liquibase 向我报告了成功的回滚操作,但没有任何变化。 我们使用sql格式SQL。例如我有 3 个文件:
CASE-0-1.sql:
--liquibase formatted sql
--changeset CASE-0-1:1 failOnError:true
CREATE TABLE tt1(
cc1 INT(11));
--rollback DROP TABLE tt1;
--rollback CREATE TABLE tr1(
--rollback cr1 INT(20));
CASE-0-2.sql:
--liquibase formatted sql
--changeset CASE-0-2:1 failOnError:true
CREATE TABLE tt2(
cc2 INT(11));
--rollback DROP TABLE tt2;
--rollback CREATE TABLE tr2(
--rollback cr2 INT(20));
CASE-0-3.sql:
--liquibase formatted sql
--changeset CASE-0-3:1 failOnError:true
CREATE TABLE tt3(
cc3 INT(11));
--rollback DROP TABLE tt3;
--rollback CREATE TABLE tr3(
--rollback cr3 INT(20));
我在进行任何更改之前标记数据库:
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--logFile=0state.tag.log --username=trunk --password=Trunk \
tag "0state"
之后,我在每个文件应用后应用文件和 TAG 数据库:
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--changeLogFile=CASE-0-1.sql --logFile=CASE-0-1.sql.update.log --username=trunk --password=Trunk \
update
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--logFile=CASE-0-1.sql.tag.log --username=trunk --password=Trunk \
tag "CASE-0-1"
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--changeLogFile=CASE-0-2.sql --logFile=CASE-0-2.sql.update.log --username=trunk --password=Trunk \
update
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--logFile=CASE-0-2.sql.tag.log --username=trunk --password=Trunk \
tag "CASE-0-2"
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--changeLogFile=CASE-0-3.sql --logFile=CASE-0-3.sql.update.log --username=trunk --password=Trunk \
update
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--logFile=CASE-0-3.sql.tag.log --username=trunk --password=Trunk \
tag "CASE-0-3"
结果:
[root@mysql]# mysql -e "SELECT ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, DESCRIPTION, COMMENTS, TAG \
> FROM DATABASECHANGELOG;" liquibase_test
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
| ID | AUTHOR | FILENAME | DATEEXECUTED | ORDEREXECUTED | EXECTYPE | DESCRIPTION | COMMENTS | TAG |
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
| 1506498093527 | liquibase | liquibase-internal | 2017-09-27 10:41:33 | 1 | EXECUTED | empty | | 0state |
| 1 | CASE-0-1 | CASE-0-1.sql | 2017-09-27 10:41:57 | 2 | EXECUTED | sql | | CASE-0-1 |
| 1 | CASE-0-2 | CASE-0-2.sql | 2017-09-27 10:42:08 | 3 | EXECUTED | sql | | CASE-0-2 |
| 1 | CASE-0-3 | CASE-0-3.sql | 2017-09-27 10:42:12 | 4 | EXECUTED | sql | | CASE-0-3 |
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
[root@mysql]# mysql -e "SHOW TABLES;" liquibase_test
+--------------------------+
| Tables_in_liquibase_test |
+--------------------------+
| DATABASECHANGELOG |
| DATABASECHANGELOGLOCK |
| tt1 |
| tt2 |
| tt3 |
+--------------------------+
现在,让我们尝试回滚:
/root/liquibase/liquibase --logLevel=debug --classpath=/usr/share/java/mysql-connector-java.jar --driver=com.mysql.jdbc.Driver \
--url="jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true" \
--changeLogFile=CASE-0-2.sql --logFile=CASE-0-2.sql.rollback.log --username=trunk --password=Trunk \
rollback "CASE-0-2"
Liquibase Rollback Successful
看起来一切正常,但未执行回滚:
[root@mysql]# mysql -e "SELECT ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, DESCRIPTION, COMMENTS, TAG \
> FROM DATABASECHANGELOG;" liquibase_test
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
| ID | AUTHOR | FILENAME | DATEEXECUTED | ORDEREXECUTED | EXECTYPE | DESCRIPTION | COMMENTS | TAG |
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
| 1506498093527 | liquibase | liquibase-internal | 2017-09-27 10:41:33 | 1 | EXECUTED | empty | | 0state |
| 1 | CASE-0-1 | CASE-0-1.sql | 2017-09-27 10:41:57 | 2 | EXECUTED | sql | | CASE-0-1 |
| 1 | CASE-0-2 | CASE-0-2.sql | 2017-09-27 10:42:08 | 3 | EXECUTED | sql | | CASE-0-2 |
| 1 | CASE-0-3 | CASE-0-3.sql | 2017-09-27 10:42:12 | 4 | EXECUTED | sql | | CASE-0-3 |
+---------------+-----------+--------------------+---------------------+---------------+----------+-------------+----------+----------+
[root@mysql]# mysql -e "SHOW TABLES;" liquibase_test
+--------------------------+
| Tables_in_liquibase_test |
+--------------------------+
| DATABASECHANGELOG |
| DATABASECHANGELOGLOCK |
| tt1 |
| tt2 |
| tt3 |
+--------------------------+
如您所见 - 我们拥有相同的 table 集,没有 table 掉落,没有创建额外的 table。
回滚日志文件中的内容:
[root@mysql]# cat CASE-0-2.sql.rollback.log:
DEBUG 27.09.17 10:53: liquibase: Connected to trunk2@127.0.0.1@jdbc:mysql://localhost/liquibase_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true
DEBUG 27.09.17 10:53: liquibase: Setting auto commit to false from true
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: select count(*) from liquibase_test.DATABASECHANGELOGLOCK
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: select count(*) from liquibase_test.DATABASECHANGELOGLOCK
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: SELECT LOCKED FROM liquibase_test.DATABASECHANGELOGLOCK WHERE ID=1
DEBUG 27.09.17 10:53: liquibase: Lock Database
DEBUG 27.09.17 10:53: liquibase: Executing UPDATE database command: UPDATE liquibase_test.DATABASECHANGELOGLOCK SET LOCKED = 1, LOCKEDBY = 'mysql-gigantic-dummy-dvaco-trunk-28.aws.srv (172.29.13.83)', LOCKGRANTED = '2017-09-27 10:53:26.625' WHERE ID = 1 AND LOCKED = 0
INFO 27.09.17 10:53: liquibase: Successfully acquired change log lock
DEBUG 27.09.17 10:53: liquibase: Computed checksum for 1506498806750 as 17f1742877fc068db5453ca9db9d60e3
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: SELECT MD5SUM FROM liquibase_test.DATABASECHANGELOG WHERE MD5SUM IS NOT NULL LIMIT 1
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: select count(*) from liquibase_test.DATABASECHANGELOG
INFO 27.09.17 10:53: liquibase: Reading from liquibase_test.DATABASECHANGELOG
DEBUG 27.09.17 10:53: liquibase: Executing QUERY database command: SELECT * FROM liquibase_test.DATABASECHANGELOG ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC
DEBUG 27.09.17 10:53: liquibase: CASE-0-2.sql: CASE-0-2.sql::1::CASE-0-2: Computed checksum for inputStream as 80fa2b893f3b36ef72cf796a9ce61189
DEBUG 27.09.17 10:53: liquibase: CASE-0-2.sql: CASE-0-2.sql::1::CASE-0-2: Computed checksum for 7:80fa2b893f3b36ef72cf796a9ce61189: as 6c11f0a414ae9865f42a220f71f1e3d1
DEBUG 27.09.17 10:53: liquibase: Release Database Lock
DEBUG 27.09.17 10:53: liquibase: Executing UPDATE database command: UPDATE liquibase_test.DATABASECHANGELOGLOCK SET LOCKED = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1
INFO 27.09.17 10:53: liquibase: Successfully released change log lock
我检查了不同的变体、不同的 liquibase 文件格式、不同的命令行选项 - 没用。 Liquibase 总是说 "Liquibase Rollback Successful",但什么都不做。
请帮忙。可能有人使用 sql 或其他格式的回滚操作?错在哪里?我做错了什么?它是否可以使用 liquibase 功能?
希望您仍然对帮助感兴趣,但据我所知,您没有包含 CASE-0-3 SQL 脚本,因此 liquibase 不知道 CASE 之外应用的更改-0-2 您提供的标签 - 因此它无法回滚。
我的团队所做的是创建一个更强大的 changelog.xml
来引用我们的 .sql 脚本,而不是使用 .sql 脚本作为更新日志文件。
如果有帮助请告诉我!
我解决了这个问题并发现它有效。问题如下: 在 migration/update 期间,--changeLogFile 参数获取文件名并在 --classpath 文件夹中找到它。然后它在其日志 table 中存储具有完整路径的文件名。
但是在回滚时同样不起作用。您需要在 --changeLogFile 中提供文件名的完整路径。它只是将此参数与日志 table 进行比较。在这种情况下,它不使用类路径在其日志中进行搜索之前准备结束到 changeLogFile table.