Ruby on rails Rails:更改生产数据库的最佳方式

Ruby on rails Rails:更改生产数据库的最佳方式,ruby-on-rails,migration,production,Ruby On Rails,Migration,Production,我需要对正在使用的生产数据库进行更改。只是添加了一些列。我已经通过迁移对dev数据库进行了更改。更新生产数据库的最佳方法是什么,同时保留现有数据,并且不会过度中断操作 这是MYSQL,我需要为已经存在的记录向列中添加数据。一列可以有一个默认值(它是布尔值),但另一列是时间戳,应该有一个任意的回溯值。行数并不多 因此,如果我使用迁移,我如何添加数据,以及如何让它只在生产数据库上执行两个(或三个-我添加数据-最新迁移),而不是最初通过迁移构建的(我相信他们使用的是模式)?您不使用在开发环境中使用的相

我需要对正在使用的生产数据库进行更改。只是添加了一些列。我已经通过迁移对dev数据库进行了更改。更新生产数据库的最佳方法是什么,同时保留现有数据,并且不会过度中断操作

这是MYSQL,我需要为已经存在的记录向列中添加数据。一列可以有一个默认值(它是布尔值),但另一列是时间戳,应该有一个任意的回溯值。行数并不多


因此,如果我使用迁移,我如何添加数据,以及如何让它只在生产数据库上执行两个(或三个-我添加数据-最新迁移),而不是最初通过迁移构建的(我相信他们使用的是模式)?

您不使用在开发环境中使用的相同迁移有什么原因吗?

在迁移中添加带有
add\u column
的列应该是非破坏性的:它将生成一个“ALTER TABLE”语句。如果您知道创建列后将在列中输入什么,则可以在迁移中填写值(如果行数较大,则可以选择耗时较少的替代方法)

我认为,删除或更改列的定义取决于平台:一些将允许在适当的位置删除列,另一些将执行重命名创建选择删除命令序列


更具体地说,我们需要更多的信息:你在看什么样的迁移,你在什么平台上运行,你需要在迁移过程中设置值吗?类似的东西会有很大帮助-只需编辑问题,这会将其推回到列表中。

我始终遵循以下步骤:

  • 使用mysqldump命令转储prod数据库
  • 使用mysql命令用dump填充dev/test数据库
  • 在dev/test中运行迁移
  • 检查迁移是否成功
  • 使用mysqldump命令转储prod数据库(可能已更改),在服务器上保留备份
  • 在prod上运行迁移(使用capristano)
  • 测试迁移在prod上起作用
  • 喝啤酒(一边看错误日志)

听起来您正处于生产数据库模式与您在开发中使用的模式不完全匹配的状态(尽管还不完全清楚)。我会在沙地上划一条线,让prod db处于更好的状态。基本上,您要做的是确保prod db具有“模式信息”表中列出了您>永远不想在生产环境中运行的任何迁移。然后,您可以将迁移添加到您的内容中,它们将对生产数据库起作用

完成后,您可以编写添加架构更改或添加数据的迁移,但有一件事需要特别小心,即如果使用迁移添加数据,则必须在迁移本身中定义模型,如下所示:

class AddSomeColumnsToUserTable < ActiveRecord::Migration
  class User < ActiveRecord::Base; end
  def self.up
    add_column :users, :super_cool, :boolean, :default => :false
    u = User.find_by_login('cameron')
    u.super_cool = true
    u.save
  end

  def self.down
    remove_column :users, :super_cool
  end
end
class AddSomeColumnsToUserTable:false
u=用户。通过登录(“cameron”)查找
u、 超级酷=真
u、 拯救
结束
def自动关闭
删除列:users,:super\u cool
结束
结束

这样做的原因是,在将来的重构或其他过程中,您可能会完全删除该模型。如果您不在“user.find\u by\u login…”行定义用户类迁移将引发异常,这是一个很大的难题。

数据库已经在使用中,因此我不想丢失现有数据,如果可以避免的话,我宁愿不花时间重建和重新填充。因此,迁移是破坏性的?或者您当前正在使用迁移,但以前从未在生产中使用过它们,等等它将尝试执行所有迁移,其中一些迁移较旧,不再相关,因此可能会导致问题?在您的问题中,您能否描述一下,您的迁移会使它们具有破坏性吗?这可能有助于更准确地回答您的问题。这是因为迁移从未在生产上运行过。因此我需要一个解决方案运行特定的非破坏性迁移的方法。您是否手动执行所有非capistrano和非beer步骤?似乎有很多地方可以实现良好的自动化/脚本编写?前三个步骤是脚本编写的。检查是自动测试和手动测试的组合。手动测试特别关注我知道已发生变化的领域。I每几周只推一次。