【问题标题】:Is it safe to run migrations on a live database?在实时数据库上运行迁移是否安全?
【发布时间】:2011-09-14 18:12:13
【问题描述】:

我有一个简单的由 Rails 支持的应用程序,每天在 Heroku Ronin 数据库中运行 2-3 百万次页面浏览量。不过,数据库上的负载非常轻,它可以处理的比我们投入的要多得多。

在不进入维护模式的情况下运行迁移以将表添加到此数据库是否安全?此外,运行迁移以向负责几乎所有读取和写入的核心表添加几列是否安全?

停机时间是不可接受的,即使是几分钟。

如果不建议实时运行迁移,我可能会设置一个新数据库,在该数据库上运行迁移,编写脚本来同步两个数据库,然后将应用程序指向新数据库。

但如果可能的话,我宁愿避免这种情况。 :)

【问题讨论】:

  • err - Heroku Ronin 不是 pg 数据库吗?不是 mysql。
  • 确实如此,感谢@OmarQureshi 指出这一点!为了后代,我将 mysql 标记更改为 postgresql 标记。

标签: ruby-on-rails postgresql migration


【解决方案1】:

听起来您的迁移包括:

  • 添加新表(可能是索引?如果是这样,那可能需要比您预期的更长的时间)
  • 添加新列(默认值和/或可为空?)
  • 将您的更改封装在事务中 (?)

建议您通过以下方式衡量您的更改将对您的 Prod 环境产生的影响:

  • 备份 Prod(包含所有 Prod 数据)
  • 运行您的更改脚本。每次操作的时间

将上述 2 点与您预期运行此程序时的典型读写负载(02:00,对吗?)进行平衡。

通过禁用(以某种方式)对受影响表的写入操作来考虑“软”停机时间。

总体而言(或一般而言),向现有表添加 n 个表和新的可空列将/可能在没有任何停机时间或性能影响的情况下完成。

始终衡量您的更改将对 Prod 副本产生的影响。在将更改应用到此副本时测量“响应性”。当然,这也意味着部署另一个 Prod 应用程序副本,但这种努力是值得的。

【讨论】:

  • 在迁移期间数据库是否会无响应?
【解决方案2】:

假设它是一个 pg 数据库(它应该用于 Heroku)。

http://www.postgresql.org/docs/current/static/explicit-locking.html

alter table 将获得访问排他锁。因此,该表将被锁定。

除此之外,您还需要重新启动 Rails 应用程序,以便它能够识别任何新模型。如果您打算将表格添加到应用程序或以任何方式修改模型代码。

至于指向具有新修改的数据库的新应用程序,您将如何进行数据同步并在同步所需的时间内同步两个数据库之间的数据更改?

【讨论】:

  • 谢谢 Omar,这正是我想知道的。我得到的是,更改表肯定已经过时了,但是添加一个新表不会锁定整个数据库。对?所以我只需要担心 Heroku 重新启动以及所有这些......
  • 确实,create table 不执行锁定。
  • 太棒了。我想我接下来要做的就是简单地添加表并通过索引链接它们。如果确实需要更改表,我将创建一个具有所需结构的新表,将其镜像到旧表,然后切换。谢谢奥马尔!
【解决方案3】:

添加表不应该是一个问题,因为您的应用程序在正确升级之前不会知道它们。至于向核心表添加列,我不太确定。如果您确实需要防止停机,最好添加一个辅助表(通过 ID 与核心表链接)添加额外的列。

只要我的两分钱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2016-09-19
    • 2021-12-05
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多