我在使用capistrano运行生产部署时遇到了一个问题。我们刚刚完成了一个包含大量数据库迁移的大型重构。
在部署期间,最糟糕的事情发生了,我的ssh连接掉线了,而cap正在进行迁移。
我认为通过我们的负载均衡器进行sshing存在问题,但这不是重点。
我设法通过在服务器上运行屏幕,迁移到此处以及之后部署来完全运行迁移。
该应用程序现已启动,似乎工作正常,但我只是想知道有人知道如果连接中断,capistrano如何处理迁移?
我可以确定在连接断开完成后执行迁移吗?
两次执行或迁移两次的几率是多少?
我认为cap会在db事务中包装每个迁移,如果发生错误就会回滚,是不是这样呢?
答案 0 :(得分:0)
松开SSH只意味着您失去了对实例的访问权限,但实例和命令已经(并且仍在)运行。
Capistrano只会在幕后执行rake db:migrate
,这基本上意味着您可以依赖完全运行完成的迁移或发现错误。即使进程暂停,由于每次迁移后模式都会更改,因此不会再次运行迁移。如果它被暂停,那么架构不会改变,当你(或capistrano)再次运行rake db:migrate
时,提示再次运行迁移。
如果您希望始终确保没有问题出现(或者可以有效处理),那么编写完全可逆的迁移 - 这可以确保在迁移错误时rake可以回滚先前运行的迁移(在调用的同一序列上运行)错误)。通常,大多数迁移在默认情况下都是可逆的,没有额外的代码,但如果你有更复杂的行为,他们可能需要编写一个特定的反向方法(比如说你正在改变列并将值转换成其他东西)。默认情况下,唯一不可逆的是表/列丢弃,除非您将类型添加到remove
语句,因为它在drop上是可选的。如果column type
存在,那么rails也会知道如何恢复掉落(无需特定的反向方法)。