【问题标题】:Database migration without downtime无需停机的数据库迁移
【发布时间】:2020-10-09 15:06:42
【问题描述】:

在我们的组织中,我们需要对实时站点数据运行数据库迁移。我们想在大约 1000 行的表中添加一个具有默认值的列。您能否建议任何方法以使我们的停机时间为零或最短。我们正在使用 postgresql 数据库和 elixir phoenix app 。 谢谢。

PS:我们想要最小的停机时间而不是精确的零。我们还想在 elixir 中使用 Ecto 而不是通过脚本来运行迁移。

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

【问题讨论】:

  • 零停机时间可能比“最短停机时间”复杂得多。对于大多数组织来说,短暂的停机时间是可以接受的。如果您能澄清您的要求,这将有所帮助——这是否需要绝对零停机时间?

标签: database postgresql elixir database-migration alter-table


【解决方案1】:

一般来说 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 行也非常小并且应该也非常快。

【讨论】:

  • 我们将在 elixir 中运行 Ecto 迁移,所以它也会很快吗?预计停机时间是几秒或几分钟?
  • 只有您才能在您自己的环境中使用您自己数据的数据库克隆真正测试测量。不要期望从在线论坛获得确切的数字。
猜你喜欢
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2012-11-16
  • 2022-08-16
相关资源
最近更新 更多