无需停机即可更改架构和将数据迁移到实时数据库的最佳实践?

Dan*_*ary 54 schema postgresql migration best-practices deployment

如何在不停机的情况下对实时数据库进行架构更改?

例如,假设我有一个 PostgreSQL 数据库,其中包含一个包含各种用户数据(如电子邮件地址等)的表,所有这些数据都与特定用户相关联。如果我想将电子邮件地址移动到一个新的专用表,我必须更改架构,然后将电子邮件数据迁移到新表。如何在不停止写入原始表的情况下完成此操作?当然,当数据从旧表写入新表时,新数据会继续写入旧表而被遗漏,对吗?

我想这个问题经常出现,但我找不到任何标准的解决方案来处理它。

这篇文章解决了这个问题,但我并没有真正理解第3步。他说要写入两个表,然后将旧数据从第一个表迁移到新表。您如何确保只迁移旧数据?

(我在 Heroku 上使用PostgreSQL。)

Erw*_*ter 31

你几乎已经有了答案:

  1. 并行创建新结构
  2. 开始写入两个结构
  3. 将旧数据迁移到新结构
  4. 只读写新结构
  5. 删除旧列

至于第 3 步,使用这样的东西(在一笔交易中):

插入尚不存在的内容:

INSERT INTO new_tbl (old_id, data)
SELECT old_id, data
FROM   old_tbl
WHERE  NOT EXISTS (SELECT * FROM new_tbl WHERE new_tbl.old_id = old_tbl.old_id);
Run Code Online (Sandbox Code Playgroud)

更新在此期间发生的变化:

UPDATE new_tbl
SET    data  = old.data
USING  old_tbl
WHERE  new_tbl.old_id = old_tbl.old_id
AND    new_tbl.data IS DISTINCT FROM old_tbl.data;
Run Code Online (Sandbox Code Playgroud)

不会触及新数据,因为它在两个地方都是相同的。

  • @SandeepanNath,在您的评论中回答问题 3:因为如果您 (a) 提出新结构,(b) 将数据迁移到它,(c) 更改您的代码以将数据写入新结构而不是旧结构,那么 *在步骤 b 和步骤 c* 之间所做的所有数据更改将仅存在于 *old* 结构中。问题是如何在不停机的情况下进行架构更改。* 再次仔细阅读此答案。 (3认同)