在实时数据库上运行迁移是否安全?

jpa*_*dvo 1 migration postgresql ruby-on-rails

我有一个简单的rails支持的应用程序,每天从Heroku Ronin数据库运行2-3百万次网页浏览.但是,数据库上的负载非常轻,而且它可以处理的比我们投入的要多得多.

在不进入维护模式的情况下运行迁移以将表添加到此数据库是否安全?另外,运行迁移是否可以安全地将几列添加到核心表中,几乎所有的读写操作都是如此?

停机是不可接受的,即使是几分钟.

如果不建议实时运行迁移,我可能会做的是设置一个新数据库,对其进行迁移,编写脚本以同步两个数据库,然后将应用程序指向新数据库.

但如果可能的话,我宁愿避免这样做.:)

p.c*_*ell 5

听起来您的迁移包括:

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

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

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

在您预期运行时(02:00,对吧?),将上面的2点与典型的读写负载进行平衡.

通过禁用(以某种方式)对正在执行的表的写操作来考虑"软"停机时间.

总体而言(或者一般而言),可以在没有任何停机时间或性能影响的情况下,将n个表和新的可空列添加到现有表中.

始终衡量您的更改对Prod副本的影响.在对此副本应用更改时测量"响应性".当然这也意味着要部署Prod应用程序的另一个副本,但这样做是值得的.