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

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

我猜这个问题经常出现,但是我找不到用于解决该问题的任何标准解决方案。第一张桌子到新一张。您如何确定仅迁移旧数据?

(我在Heroku上使用PostgreSQL。)

评论

Facebook开发了一种用于MySQL的工具。

K. Scott Allen在此处介绍了一种用于管理模式版本的系统。我创建了DbUpdater,这是一个用于版本感知模式部署的开源工具。更多内容-http://www.tewari.info/dbupdater

@NickChammas感谢您的分享。我对此有很多疑问。您能否建议一个更详细的教程,最好是一个视频,它解释诸如位日志,非聚集索引之类的问题,并回答诸如-1的问题。与复制到目标相比,如何从源表中选择数据到外文件中直接表。 2.复制阶段何时结束?这些只是我的几个问题,我才刚刚开始阅读。

@SandeepanNath-对不起,我不太熟悉Facebook的工具,因此无法为您提供更多资源。我读了有关它的公告并在几年前发表了评论,但我从未使用过它。

#1 楼

您几乎已经有了答案:


并行创建新结构
开始写两个结构
仅将旧数据迁移到新结构
编写和读取新结构
删除旧列

对于第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);


同时更新已更改的内容:两个地方都一样。

评论


在尝试了解您提出此答案的方案时,我有几个问题。1.是否将在数据库更改开始时部署代码更改? 2.为什么需要写两个结构? 3.为什么不能先提出新结构,然后再迁移现有数据,然后部署将填充新结构的代码更改? 4.为什么需要找出不存在的内容(您的第一个查询)?您是否建议多次插入?

–山迪潘·纳斯(Sandeepan Nath)
16年5月13日在18:42

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

–通配符
17-10-17在1:22