我是编程新手。我在生产中使用Rails 4和Postgres作为数据库。当我更改数据库结构时,使用Capistrano部署时更新生产数据库的最佳实践是什么?我想保留生产中的所有数据。
我注意到有时当我改变模式并部署到生产时,一些现有的数据记录丢失了。

最佳答案

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

class AddUsersDiscountToken < ActiveRecord::Migration
  def change
    add_column :users, :discount_token, :string
  end
end

此迁移将向discount_token表中添加一个users列,可以应用于:
rake db:migrate

在Capistrano中有一个任务,一旦部署成功,它将为您完成此任务。除了引入这个新字段之外,不应丢失任何数据,也不应更改任何记录。如果发生了什么事,你的迁徙过程中会发生一些非常奇怪的事情。
记住,一些规则:
在应用任何迁移之前,请始终使用适当的工具备份数据。mysqldump是一个很好的开始。复制二进制的MySQL数据文件是不够的,而且根本无法可靠地工作。
总是测试你的备份,并确保一切都在那里。备份进程可能由于某些原因提前终止,未能正确备份所有表和数据。
如果不首先在副本上进行测试,请不要在实时生产数据库上部署迁移。这就是备份的用武之地,您有机会恢复它,运行迁移,并测试结果。
这就是为什么有一个登台服务器通常很方便,即使它只是一个临时服务器,或者不如您的生产服务器强大。它允许您在实际的生产数据上测试迁移,而不必冒中断服务的风险。使用新迁移的生产数据库运行新的生产代码,并验证您添加的新功能是否正常工作,同时检查您没有用回归方法破坏任何旧代码。
请记住,更改大型表(例如具有数百万行的表)架构的迁移可能需要一些时间才能完成,特别是在具有非SSD支持的数据库的服务器上。在登台系统上进行测试时,请记下需要多长时间才能完成,因为您可能需要提前通知用户进行计划维护,或者更改计划以减少迁移方面的中断。

10-01 23:44
查看更多