Flyway 回滚迁移
1. 简介
在这个简短的教程中,我们将探索几种使用 Flyway 回滚迁移的方法。
2. 使用迁移模拟回滚
在本节中,我们将使用标准迁移文件回滚数据库。
在我们的示例中,我们将使用 Flyway 的命令行版本。但是,核心原则同样适用于其他格式,例如核心 API、Maven 插件等。
2.1. 创建迁移
首先,让我们在数据库中添加一个新的book表。为此,我们将创建一个名为 V1_0__create_book_table.sql的迁移文件:
create table book (
id numeric,
title varchar(128),
author varchar(256),
constraint pk_book primary key (id)
);
其次,让我们应用迁移:
./flyway migrate
2.2. 模拟回滚
然后,在某个时候,假设我们需要逆转上一次迁移。
为了将数据库恢复到创建book表之前,让我们创建名为 V2_0_drop_table_book.sql 的迁移:
drop table book;
接下来,让我们应用迁移:
./flyway migrate
最后,我们可以使用以下命令检查所有迁移的历史记录:
./flyway info
这给了我们以下输出:
+-----------+---------+-------------------+------+---------------------+---------+
| Category | Version | Description | Type | Installed On | State |
+-----------+---------+-------------------+------+---------------------+---------+
| Versioned | 1.0 | create book table | SQL | 2020-08-29 16:07:43 | Success |
| Versioned | 2.0 | drop table book | SQL | 2020-08-29 16:08:15 | Success |
+-----------+---------+-------------------+------+---------------------+---------+
请注意,我们的第二次迁移成功运行。
就 Flyway 而言,第二个迁移文件只是另一个标准迁移。将数据库实际恢复到以前的版本完全是通过 SQL 完成的。例如,在我们的例子中,删除表的 SQL 与创建表的第一次迁移相反。
使用这种方法,审计跟踪不会向我们显示第二次迁移与第一次迁移相关,因为它们具有不同的版本号。为了获得这样的审计线索,我们需要使用 Flyway Undo。
3. 使用 Flyway Undo
首先,需要注意的是**Flyway Undo 是 Flyway 的商业功能,在社区版中不可用。**因此,我们需要专业版或企业版才能使用此功能。
3.1. 创建迁移文件
首先,让我们创建一个名为 V1_0_create_book_table.sql的迁移文件:
create table book (
id numeric,
title varchar(128),
author varchar(256),
constraint pk_book primary key (id)
);
其次,我们创建对应的undo迁移文件U1_0_create_book_table.sql:
drop table book;
在我们的撤消迁移中,请注意文件名前缀是“U”与正常迁移前缀“V”相比如何。此外,在我们的撤消迁移文件中,我们编写了反转相应迁移文件更改的 SQL。在我们的例子中,我们将删除由正常迁移创建的表。
3.2. 应用迁移
接下来,让我们检查迁移的当前状态:
./flyway -pro info
这给了我们以下输出:
+-----------+---------+-------------------+------+--------------+---------+----------+
| Category | Version | Description | Type | Installed On | State | Undoable |
+-----------+---------+-------------------+------+--------------+---------+----------+
| Versioned | 1.0 | create book table | SQL | | Pending | Yes |
+-----------+---------+-------------------+------+--------------+---------+----------+
请注意最后一列Undoable,它表示 Flyway 检测到伴随我们正常迁移文件的撤消迁移文件。
接下来,让我们应用我们的迁移:
./flyway migrate
完成后,我们的迁移就完成了,并且我们的模式有一个新的 book 表:
List of relations
## Schema | Name | Type | Owner
public | book | table | blogdemo
public | flyway_schema_history | table | blogdemo
(2 rows)
3.3. 回滚上次迁移
最后,让我们使用命令行撤消上一次迁移:
./flyway -pro undo
命令成功运行后,我们可以再次检查迁移的状态:
./flyway -pro info
这给了我们以下输出:
+-----------+---------+-------------------+----------+---------------------+---------+----------+
| Category | Version | Description | Type | Installed On | State | Undoable |
+-----------+---------+-------------------+----------+---------------------+---------+----------+
| Versioned | 1.0 | create book table | SQL | 2020-08-22 15:48:00 | Undone | |
| Undo | 1.0 | create book table | UNDO_SQL | 2020-08-22 15:49:47 | Success | |
| Versioned | 1.0 | create book table | SQL | | Pending | Yes |
+-----------+---------+-------------------+----------+---------------------+---------+----------+
请注意撤消是如何成功的,并且第一次迁移又回到了挂起状态。此外,与第一种方法相比,审计跟踪清楚地显示了回滚的迁移。
尽管 Flyway Undo 很有用,但它假定整个迁移已成功。 例如,如果迁移中途失败,它可能无法按预期工作。