简介
我是一家小公司的初级DevOps工程师,我们在一个开发集群中部署了一个应用程序(Microservices )。
我们已经建立了一个良好的CI/CD管道,在这里您可以进行构建、单元测试、构建坞映像、功能测试和部署等步骤。
现在,我正在尝试添加一些步骤来测试PSQL dataBase的迁移和回滚。为此,我们正在使用Liquibase。
您可能知道,液化基使用迁移和回滚脚本,而这些脚本需要处理数据集成(数据不能从一个版本丢失或添加到另一个版本)。这将确保我可以在任何时候进行更新/回滚,甚至在生产中也是如此。
测试用例
在本例中,我假设我有以下tableA (DB模式version_0.0.0):
+------+--------+
| id | id_2 |
+------+--------+
| 1 | 1 |
+------+--------+
| 1 | 2 |
+------+--------+
| 1 | 3 |
+------+--------+
| 1 | 4 |
+------+--------+其中主键称为"tablea_pkey“,由tableA (id,id_2)组成。
我需要将DB模式升级到以下内容(version_1.0.0):
+------+--------+--------+
| id | id_2 | id_3 |
+------+--------+--------+
| 1 | 1 | 1 |
+------+--------+--------+
| 1 | 2 | 1 |
+------+--------+--------+
| 1 | 3 | 1 |
+------+--------+--------+
| 1 | 4 | 1 |
+------+--------+--------+其中主键将被称为"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),会引发一个错误,因为我将在表上有重复的值.
发问
你们能告诉我如何在不丢失任何数据的情况下编写回滚脚本吗?
发布于 2019-11-14 17:03:08
如果您确信将来需要回滚,更好的解决方案是使用pg_dump或在数据库中创建备份表。
在此之后,执行主键更改,以便以后您可以轻松地恢复到进行更改的时间。
无论如何,如果您正在回滚,任何新的数据也将被回滚。
https://stackoverflow.com/questions/58861351
复制相似问题