この記事について
この記事では、自身がRailsで開発しているアプリをCapistranoでデプロイをしようとした時にエラーが発生し、解決するまでに試した作業を書いています。
同様のエラーが起きた際に自分が読み返すために書いていますが、他の方の参考にもなれば嬉しいです。
前回の記事と同じような状況ながら違う原因でエラーが出ていたので、別の記事として書くことにしました。
エラーが起こった時の状況
Capistranoで自動デプロイを実行したがエラーのため完了でしませんでした。
エラーの内容を確認してみると、以下のように書かれていました。
00:15 deploy:migrating
01 $HOME/.rbenv/bin/rbenv exec bundle exec rake db:migrate
01 rake aborted!
01 StandardError: An error has occurred, all later migrations canceled:
01
01 Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` var…
まだまだエラー表示は続きますが、要は「migrationでuserテーブルを作成しようとしたが、userテーブルが既に存在するので実行できません」ってことですね。
チーム開発をしている状況で、migrationファイルが変わってしまって上手くマイグレーションできなかったものと思われます。今後も開発中にチームメンバーの更新によって変更が発生する可能性も無くはないでしょうか。
解決までの作業
今回のエラーはmigrationファイルと現状のデータベースで齟齬が発生してしまったため起こったものと考えられます。
そこでデータベースを一度削除し、1からマイグレーションを行うことで解決できると考えました。
サーバー環境のMySQLに接続し、既存のデータベースを削除する
ターミナルからawsにアクセスし、データベースを操作するためにMySQLに接続します。
mysql -u root -p
パスワードを入力すればMySQLへの接続が完了します。接続できたら既存のデータベースを削除します。まずは削除するデータベースを確認します。
show databases;
# 実行結果
+--------------------+
| Database |
+--------------------+
| information_schema |
| sample_production |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
データベースの名前が確認できたら、そのデータベースを削除します。
mysql> drop database`sample_production`;
# 実行結果
Query OK, 9 rows affected (0.07 sec)
これで既存のデータベースは削除されました。
データベースを再作成する
データベースがないままだと自動デプロイができませんので、削除した後は再びデータベースを作成します。
MySQLからの操作でも作成できそうですが、今回はawsからの操作で作成します。
mysql> quit
[ec2-user@ip-111-111-111-111 sample]$ rails db:create RAILS_ENV=production
マイグレーションを実行する(自動デプロイを実行)
bundle exec cap production deploy
以上です。今回はこの作業で自動デプロイができるように復旧できました。