Contents

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 很有用,但它假定整个迁移已成功。 例如,如果迁移中途失败,它可能无法按预期工作。