Railsでデプロイ中にデータベースマイグレーションが止まってしまう

背景

普段はRailsを利用していて、いつも通りステージングデプロイ後にプロダクションデプロイを行う予定でした。

デプロイツールはcapistrano3を利用しています。今回のデプロイではデータベースマイグレーションも含まれています。データベースマイグレーションが含まれているデプロイは通常のデプロイより少し緊張しますが、基本的にはなにも問題は起こりません。

ステージング環境ではなにごともなくデプロイが完了し、マイグレーションも終わっています。動作確認も終わったので本番にデプロイしました。すると、マイグレーションで止まってしまい、先に進みません…

原因

原因がわからず何度かデプロイを行ってみましたが変わりませんでした。

そういえばデプロイ前にデータ補正のためにMySQLクライアントでデータベースに接続していました。関係あるのかなぁ?と思ったのですが、通常、いろんなクライアントが接続しているため問題ないと思いました。

とりあえず接続しているMySQLクライアントを終了すると、止まっていたデプロイが一気に進み、エラーを大量に吐いて終了しました。

このときになんとなく原因がわかりました。データ補正のためにトランザクションをかけていたのでした

1
2
3
4
5
mysql> set autocommit = 0;
mysql> update data_table set name = 'xxxxxx';
mysql> commit;

この状態で放置していた…

今回マイグレーションではデータ補正していたテーブルに対してカラムを追加するという処理を行っていました。トランザクションをかけていたのが原因だったのです。

まとめ

マイグレーションを行うデプロイを行う際はトランザクションを利用しているセッションは切っておくこと。