15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

デプロイで「ERROR -- : Unknown database 'データベース名' (ActiveRecord::NoDatabaseError)」と出て苦労した話

Last updated at Posted at 2019-10-25

起こったこと

プログラミングスクールの最終課題で某フリマアプリのコピーサイトをチームで作っています。
チームメンバーがマージしたものをデプロイした際にこんなエラーが発生しました

ターミナル
Mysql2::Error: Duplicate column name 'image_id': ALTER TABLE `items` ADD `image_id` int NOT NULL AFTER `category_id`

まず、このエラー文が何かを調べることにしました。
先ほどのエラー内容は
「カラムが重複してるから、そんなことできません!」って意味になります。
すでに出来上がっているカラムをさらに追加しようとしたことが原因みたいです。

ふーん原因はわかったぞ
でも念のために本番環境でもエラーを見ておこう

ここからが地獄の始まりでした。

地獄の始まり

本番環境でエラーを見るために
Less log/unicorn.stderr.logを実行するとこんな文章が

本番環境
ERROR -- : Unknown database 'データベース名' (ActiveRecord::NoDatabaseError)

###・・・はぁ!?

そんなわけない、今までデプロイできてたじゃん!

焦って、mysqlのデータベースが存在しているか確認

本番環境
mysql -u root -p #データベースの立ち上げ

# パスワード認証が出るので設定したパスワードを入力。入れたら以下を記述

show databases;

# 存在するデータベースが表示される

確認するとデータベースは存在している、しかしエラーがわからないな。
怖いから、サーバーを再起動して、データベースのリセットを試みました。

本番環境
# リセットのためのコマンド
RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop

# エラー文として表示されたもの
Access denied for user ''@'localhost' to database 'データベース名'

アクセスが拒否された・・・?
なんでだー!

ここで私はデータベースを削除する決心を固めました。

もう一度本番環境でmysqlにアクセスし
drop database データベース名;を実行

マイグレーションファイルもできてるし、もう一度createしてからmigrateを実行すればどうにかなる!

まだ続くよ!

本番環境
# テーブルを作成するコマンド
rails db:create RAILS_ENV=production

# エラー文
Mysql2::Error::ConnectionError: Access denied for user ''@'localhost' to database 'テーブル名': CREATE DATABASE `テーブル名` DEFAULT CHARACTER SET `utf8`
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"テーブル名", "password"=>nil, "socket"=>"/var/lib/mysql/mysql.sock", "database"=>"テーブル名"}

###ならなかったよぉ!

パスワードはnilだし、Access denied for user ''@'localhost'ってrootが空白になってるし!

そうだ、database.ymlを確認しよう、設定ミスかもしれない!

database.yml
production:
  <<: *default
  database: データベース名
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

記述はあっている。どこを間違えたのだろうか。。。

明かされる衝撃の事実!

色々と調べるうちになーんだ、そんなことかよ!って気づきました。
本番環境で作業するディレクトリを間違えていました。

currentディレクトリで実行する

これがデータベースにアクセスできない、作成できないの原因でした。
``本番環境で初回デプロイ実行後、currentフォルダ内のデータが本番環境で動いているフォルダ群となるようです!```
私は、アプリ名のディレクトリで今までcreateを実行しようとしていたので、そんなもの見つからねぇよ!と弾かれていたのです。

なのでcurrentディレクトリに移動し
rails db:create RAILS_ENV=production を実行!

###データベースができた!

rails db:migrate RAILS_ENV=production を実行!

###テーブルが反映された!

ローカルでbundle exec cap production deployを実行!

###デプロイできたよ!

これで一安心してはいけません。
seed.rbの反映するのを忘れるところでした。
本番環境でrake db:seed RAILS_ENV=productionを実行、その後アクセス。
ちゃんとページが表示されました。

#結論

bundle exec cap production deployを初回実行後は、currentディレクトリに本番環境のデータが入っている

15
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?