Help us understand the problem. What is going on with this article?

Capistranoでの自動デプロイでエラーが起きた際の対処方法(migration error)その2

この記事について

 この記事では、自身が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

 以上です。今回はこの作業で自動デプロイができるように復旧できました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした