数据库 migration/rollback - PSQL

DB migration/rollback - PSQL

简介

我在一家小公司担任初级 DevOps 工程师,我们在开发集群中部署了一个应用程序(微服务架构)。
我们已经构建了一个很好的 CI/CD 管道,其中包含构建、单元测试、构建 docker 图像、功能测试和部署等步骤。
现在,我正在尝试添加步骤来测试 PSQL 数据库的迁移和回滚。为此,我们使用 Liquibase.
您可能知道,liquibase 与迁移和回滚脚本一起使用,这些脚本需要处理数据集成(数据不能丢失或从一个版本添加到另一个版本)。这将确保我可以在任何时候执行 update/rollback,即使是在生产中。

测试用例

在这种情况下,我假设我有以下 tableA(数据库模式 version_0.0.0):

+------+--------+
|  id  |  id_2  |
+------+--------+
| 1    | 1      |
+------+--------+
| 1    | 2      |
+------+--------+
| 1    | 3      |
+------+--------+
| 1    | 4      |
+------+--------+

其中PRIMARY KEY叫做"tablea_pkey",由tableA(id,id_2)

组成

我需要将数据库模式升级到以下 (version_1.0.0):

+------+--------+--------+
|  id  |  id_2  |  id_3  |
+------+--------+--------+
| 1    | 1      | 1      |
+------+--------+--------+
| 1    | 2      | 1      |
+------+--------+--------+
| 1    | 3      | 1      |
+------+--------+--------+
| 1    | 4      | 1      |
+------+--------+--------+

其中PRIMARY KEY将被称为"tablea_pkey",由tableA (id, id_2, id_3)组成。

对于迁移脚本,我有以下内容:

ALTER TABLE tableA add column third_id BIGINT NOT NULL DEFAULT  1;
ALTER TABLE tableA DROP CONSTRAINT tablea_pkey;
ALTER TABLE ONLY  tableA ADD CONSTRAINT "tablea_pkey" PRIMARY KEY (id, id_2, id_3);

但是,对于我的回滚脚本,事情变得有点困难,因为它需要确保它处理数据集成!
如果 table 的更新版本投入生产(应用程序代码也已更改)并且此值进入新的 table:

+------+--------+--------+
|  id  |  id_2  |  id_3  |
+------+--------+--------+
| 1    | 1      | 1      |
+------+--------+--------+
| 1    | 2      | 1      |
+------+--------+--------+
| 1    | 3      | 1      |
+------+--------+--------+
| 1    | 4      | 1      |
+------+--------+--------+
| 1    | 4      | 2      |
+------+--------+--------+

我的脚本应该如何恢复到以前的版本? 当然,如果我尝试回滚到 primary_key(id, id_2) 会出现错误,因为我将在 table...[=15= 上重复值]

问题

你们能告诉我如何在不丢失任何数据的情况下编写回滚脚本吗?

如果您确定将来需要回滚,更好的解决方案是使用 pg_dump 备份 table 或在 table 中创建备份数据库。

在此之后,更改主键,以便将来您可以轻松恢复到更改时的时间。

无论如何,如果您正在回滚,任何新数据也会被回滚。