我是编程新手。我在生产中使用Rails 4和Postgres作为数据库。当我更改数据库结构时,使用Capistrano进行部署时更新生产数据库的最佳做法是什么?我想保留生产中的所有数据。更新生产数据库的最佳实践?
我注意到有时当我更改模式并部署到生产环境时,现有的一些数据记录丢失了。
我是编程新手。我在生产中使用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支持的数据库的服务器上。在分级系统上进行测试时,请记下完成所需的时间,因为您可能需要提前通知您的用户进行定期维护,或对计划进行更改,以减少迁移方面的干扰。
除非您删除表格或删除列migrations
永远不会导致您的任何问题。
为了避免某些迁移相关的问题请确保您有以下这一点:
table
或column
不是删除和创建具有相同结构的表。reversible
以防您需要回滚counter-script
。在执行之前阅读提议的迁移。然后在登台服务器上执行它并查看它做了什么,验证结果。然后才考虑生产。 –
@CraigRinger这是一个很好的观点 –
第一步:根本不要这样做,直到您有连续的备份和存档。 –