繁体   English   中英

数据库迁移/回滚 - PSQL

[英]DB migration/rollback - PSQL

介绍

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

测试用例

在这种情况下,我假设我有以下 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);

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

+------+--------+--------+
|  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) 会引发错误,因为我将在表上重复值....

问题

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM