【问题标题】:Rails: Best way to make changes to a production databaseRails:更改生产数据库的最佳方式
【发布时间】:2010-09-17 08:59:12
【问题描述】:

我需要对正在使用的生产数据库进行更改。只需添加几列。我已经通过迁移对开发数据库进行了更改。在保留现有数据且不会过多干扰操作的情况下更新生产数据库的最佳方法是什么?

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

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

【问题讨论】:

    标签: ruby-on-rails migration production


    【解决方案1】:

    我总是遵循这个程序:

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

    【讨论】:

    • 您是否手动执行所有非 capistrano 和非啤酒步骤?似乎有很多地方可以进行良好的自动化/脚本编写?
    • 前三个步骤是脚本化的。检查是自动测试和手动测试的组合。手动测试特别关注我知道已经改变的领域。我每隔几周才推送一次。
    【解决方案2】:

    听起来您处于生产数据库架构与您在 dev 中使用的架构不完全匹配的状态(尽管并不完全清楚)。我会在沙子上画一条线,让 prod db 处于更好的状态。本质上,您要做的是确保 prod db 有一个“schema_info”表,其中列出了您>不

    完成后,您可以编写添加架构更改或添加数据的迁移,但您需要非常小心的一件事是,如果您使用迁移添加数据,则必须在迁移本身中定义模型,像这样:

    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
    

    这样做的原因是,将来您可能会在某些重构或其他过程中完全删除该模型。如果您没有在“User.find_by_login...”行定义用户类,迁移将抛出异常,这是一个很大的痛苦。

    【讨论】:

      【解决方案3】:

      您没有使用与您在开发环境中使用的迁移相同的原因吗?

      【讨论】:

      • 数据库已经在使用中,所以我不想丢失现有数据,如果可以避免的话,我宁愿不必花时间重建和重新填充。
      • 那么,迁移是破坏性的吗?或者您目前正在使用迁移,但之前从未在生产中使用过它们,因此它会尝试执行所有迁移,其中一些迁移较旧且不再相关,因此可能会导致问题?
      • 您能否在问题中描述一下您的迁移如何使它们具有破坏性?这可能有助于为您的问题获得更准确的答案。
      • 迁移从未在生产环境中运行。所以我需要一种方法来运行特定的非破坏性迁移。
      【解决方案4】:

      在迁移中添加带有add_column 的列应该是非破坏性的:它将生成“ALTER TABLE”语句。如果您知道创建后要放入列中的内容,则可以在迁移中填写值(如果行数很大,您可以选择耗时较少的替代方案)。

      我认为,删除或更改列的定义取决于平台:有些允许就地删除列,有些则执行重命名-创建-选择-删除命令序列。

      为了更具体,我们需要更多信息:您正在查看哪种迁移,您在哪个平台上运行,您是否需要在迁移过程中设置值?类似的东西会有很大帮助 - 只需编辑问题,这会将其推回到列表中。

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多