无需停机即可进行数据库迁移



在我们的组织中,我们需要对实时站点数据运行数据库迁移。我们想在大约 1000 行的表中添加一列具有默认值的列。您能否建议任何方法,以便我们获得零或最短停机时间。我们正在使用postgresql数据库和长生不老药凤凰应用程序。 谢谢。

PS :我们想要最短的停机时间而不是确切的零。此外,我们希望在 elixir 中使用 Ecto 而不是通过脚本运行迁移。

此外,如果您可以告诉我们设置了默认约束时运行迁移的预期时间。

通常,ALTER TABLE 需要对表进行独占锁定,但添加具有默认值的列可能非常快,因为只应更新系统目录(并且此操作不依赖于表大小(:

例如,使用 PostgreSQL 12,我得到:

# select count(*) from t;
count  
---------
1000000
(1 row)
Time: 60.003 ms
# begin;
BEGIN
Time: 0.096 ms
# alter table t add newcol int default 19;
ALTER TABLE
Time: 0.457 ms
# commit;
COMMIT
Time: 9.211 ms

您应该能够使用 PostgreSQL 11 或 12 获得非常小的停机时间。使用较低版本的PG重写表:但即使在这种情况下,1000行也非常非常小,也应该非常快。

最新更新