数据库 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 中创建备份数据库。
在此之后,更改主键,以便将来您可以轻松恢复到更改时的时间。
无论如何,如果您正在回滚,任何新数据也会被回滚。
简介
我在一家小公司担任初级 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 中创建备份数据库。
在此之后,更改主键,以便将来您可以轻松恢复到更改时的时间。
无论如何,如果您正在回滚,任何新数据也会被回滚。