Ruby on rails capistrano迁移期间连接中断

Ruby on rails capistrano迁移期间连接中断,ruby-on-rails,deployment,capistrano,Ruby On Rails,Deployment,Capistrano,我在使用capistrano运行生产部署时遇到了一个问题。我们刚刚完成了一个包含大量数据库迁移的大型重构 在部署过程中,最糟糕的情况发生了,我的ssh连接断开,而cap正在迁移过程中运行 我认为通过我们的负载平衡器进行sshing有一个问题,但这与问题无关 通过在服务器上运行screen,在这里迁移,然后部署,我成功地使迁移完全运行 该应用程序现在已经启动,似乎运行良好,但我只是想知道,如果连接中断,是否有人知道capistrano如何处理迁移 我是否可以确保在断开连接时执行的迁移已完成 执行一

我在使用capistrano运行生产部署时遇到了一个问题。我们刚刚完成了一个包含大量数据库迁移的大型重构

在部署过程中,最糟糕的情况发生了,我的ssh连接断开,而cap正在迁移过程中运行

我认为通过我们的负载平衡器进行sshing有一个问题,但这与问题无关

通过在服务器上运行screen,在这里迁移,然后部署,我成功地使迁移完全运行

该应用程序现在已经启动,似乎运行良好,但我只是想知道,如果连接中断,是否有人知道capistrano如何处理迁移

我是否可以确保在断开连接时执行的迁移已完成

执行一半或两次迁移的可能性有多大


我假设cap将每个迁移封装在一个db事务中,如果发生错误,该事务将回滚,是这样吗?

失去SSH只意味着您失去了对实例的访问,但实例和命令已经(并且仍然)在运行

Capistrano将只在后台执行
rake db:migrate
,这基本上意味着您可以依赖于迁移完全运行到完成或发现错误。即使进程停止,因为每次迁移后模式都会更改,所以迁移也不会再次运行。如果暂停,则模式不会更改,当您(或capistrano)再次运行
rake db:migrate
时,会提示再次运行迁移


如果您希望始终确保不会出现(或可以有效处理)完全可逆的写迁移问题,这可以确保在出现迁移错误时,rake可以回滚以前运行的迁移(在调用错误的相同序列上运行)。通常,默认情况下,大多数迁移都是可逆的,不需要额外的代码,但是如果您有更复杂的行为,则可能需要编写特定的反向方法(例如更改列并将值转换为其他内容)。默认情况下唯一不可逆的是表/列删除,除非您将类型添加到
remove
语句中,因为它在删除时是可选的。如果存在
列类型
,那么rails也将知道如何恢复删除(不需要特定的反向方法)。

您确定迁移运行到完成吗?当我手动登录并运行迁移时,它们在连接断开时运行的迁移之后的迁移中启动。我知道执行的迁移不会再次运行,这就是为什么我觉得重新运行db:migrate很安全,但我不知道我对连接断开的特定迁移有多大信心……嗯,也许你是对的,当连接断开时它会停止,但我所说的“如果它停止…”基本上是这样的,对于未执行的迁移,模式不会更改,因此,如果您返回并重新运行
db:migrate
,它将在左侧的第一次“unrun”迁移中继续运行。我假设数据库本身(除了rails、ruby和rake)对
非持久化的
更改(记录本身(ACID)以及模式/表)具有故障保护。