Ruby on rails 更新生产数据库的最佳实践?

Ruby on rails 更新生产数据库的最佳实践?,ruby-on-rails,postgresql,capistrano,Ruby On Rails,Postgresql,Capistrano,我是编程新手。我在生产中使用Rails 4和Postgres作为数据库。当我更改数据库结构时,使用Capistrano部署时更新生产数据库的最佳实践是什么?我想保持生产中的所有数据完好无损 我注意到,有时当我更改架构并部署到生产环境时,一些现有数据记录会丢失。除非您删除表或删除列,否则迁移将不会导致任何问题 要避免某些与迁移相关的问题,请确保遵循以下步骤: 如果可能,尝试重命名表或列,而不是删除并创建具有相同结构的表 检查您的迁移是否是可逆的,以防需要回滚 如果要编写脚本来更新数据库,请确保已准

我是编程新手。我在生产中使用Rails 4和Postgres作为数据库。当我更改数据库结构时,使用Capistrano部署时更新生产数据库的最佳实践是什么?我想保持生产中的所有数据完好无损


我注意到,有时当我更改架构并部署到生产环境时,一些现有数据记录会丢失。

除非您删除表或删除列,否则迁移将不会导致任何问题

要避免某些与迁移相关的问题,请确保遵循以下步骤:

  • 如果可能,尝试重命名
    ,而不是删除并创建具有相同结构的表
  • 检查您的迁移是否是可逆的,以防需要回滚
  • 如果要编写脚本来更新数据库,请确保已准备好
    计数器脚本
  • 最重要的通过@CraigRinger

  • 通常,在对模式进行更改时,您将使用
    rails g migration
    生成新的迁移,然后执行以下操作:

    class AddUsersDiscountToken < ActiveRecord::Migration
      def change
        add_column :users, :discount_token, :string
      end
    end
    
    在Capistrano中,有一项任务将在部署成功后为您完成此任务。除了引入这个新字段外,不应丢失任何数据,不应更改任何记录。如果发生任何其他情况,您的迁移过程中会发生一些非常奇怪的事情

    记住,有几条规则:

    • 在使用适当的工具应用任何迁移之前,始终备份数据
      mysqldump
      是一个很好的起点。复制二进制MySQL数据文件是不够的,如果有的话,也不能可靠地工作
    • 始终测试您的备份,确保一切就绪。由于某种原因,备份过程可能提前终止,无法正确备份所有表和数据
    • 在不首先对副本进行测试的情况下,切勿在实时生产数据库上部署迁移。这就是备份方便的地方,您有机会恢复备份、运行迁移和测试结果
    这就是为什么登台服务器通常很方便的原因,即使它只是一个临时服务器,或者不如生产服务器强大。它允许您在实际的生产数据上测试迁移,而无需承担中断服务的风险。使用新迁移的生产数据库运行新的生产代码,验证您添加的新功能是否正常工作,并检查您是否使用回归破坏了任何旧代码


    请记住,改变大型表(如具有数百万行的表)架构的迁移可能需要一些时间才能完成,尤其是在具有非SSD支持数据库的服务器上。在登台系统上进行测试时,请记下完成测试所需的时间,因为您可能需要提前通知用户进行定期维护或更改计划,以减少迁移的中断。

    第一步:根本不要这样做,直到您有了连续备份和存档。在执行迁移之前,请阅读建议的迁移。然后在临时服务器上执行它,看看它做了什么,验证结果。只有考虑生产。
    rake db:migrate