2017-07-18 3 views
0

capistranoを使用して本番稼動中に問題が発生しました。私たちは、大量のデータベース移行を含む大規模なリファクタリングを終了しました。カピストラの移行中に接続が中断されました

デプロイ中に、キャップが移行中に実行されていた最悪の事態が起こり、ssh接続が切断されました。

私はロードバランサを介してsshingに問題があると思うが、それはポイントの横にある。

私は、サーバー上で画面を実行し、ここで移行し、後で展開することで移行を完全に実行することができました。

アプリが今すぐアップしているようですが、接続が中断された場合のcapistranoの移行処理方法を知っていますか?

接続が切断されたときに実行された移行が完了していることを確認できますか?

半分の実行または移行が2回実行される可能性はありますか?

エラーが発生した場合にロールバックするdbトランザクションで各移行をラップすると仮定しますが、これが該当しますか?

答えて

0

SSHを失うと、インスタンスへのアクセスが失われただけですが、インスタンスとコマンドはすでに実行中(まだ実行中)であることを意味します。

Capistranoはrake db:migrateのみを実行します。これは基本的に、完全に実行されている移行またはエラーが検出されたことに依存することを意味します。プロセスが停止しても、各移行後にスキーマが変更されるため、移行は再度実行されません。また、停止した場合、スキーマは変更されず、別の時間にrake db:migrateが実行されたときに移行が再度実行されます。

完全に可逆な書き込みの問題が発生しないようにする(または効果的に対処できる)ことを確実にしたい場合は、マイグレーションエラーでrakeが以前に実行したマイグレーションをロールバックできるようにしますエラー)。通常、ほとんどの移行はデフォルトでは余分なコードを必要とせずに元に戻すことができますが、より複雑な動作をしている場合は、逆の特定の方法を記述する必要があります。 removeステートメントにタイプを追加しない限り、デフォルトではリバーシブルにならないのはテーブル/カラムドロップだけです。これはドロップではオプションなので、ドロップします。 column typeが存在する場合、レールはドロップを元に戻す方法も知っています(特定の逆方法は必要ありません)。

+0

移行が完了するまでは実行してもよろしいですか?私がログオンして手動で移行を実行したとき、移行が開始された後で移行が開始されました。 実行された移行がもう一度実行されないことを理解しています。そのため、安全な再実行db:migrateを感じましたが、接続が低下した特定の移行についての自信がありません。 – Dalaigh88

+0

あなたが正しいです、そして、接続が落ちたときに停止しますが、私が "それが停止されていれば..."という意味は基本的に、実行されていない移行のためにスキーマが変更されないため、 'db:migrate'を実行すると、そこから最初に実行された"実行されていない "移行が実行されます。私は、データベース自体(レール、ルビー、レーキを除く)は、レコード自身(ACID)とスキーマ/テーブルのどちらにも「非永続」変更があるフォールトを保護していると仮定します。 –

関連する問題