LoginSignup
6
2

More than 3 years have passed since last update.

本番環境のデータベースを書き換える(DB破壊系の処理)

Posted at

ローカル環境ではちゃんと表示出来ているのに本番環境でページが表示されない!

Image from Gyazo

がーん!!!

他のページは表示されてるのに・・・

気を取り直して、状況を整理して原因を特定してみる

1,デプロイ自体は上手くいっている? ので他のページは表示されている

2,特定のページだけ表示されていない

3、しかしローカルではちゃんと表示されている(ここ重要)

以上から なんとな〜く 特定のページに対して ローカルと本番環境で何か相違が起きてると想像する。

例えばbundler のバージョンが ローカルと本番環境で異なっている場合 全体のデプロイが上手くいかないはずなので おそらく該当のページに対して 何らかのエラーなんだろうな〜

と考えてみても仕方ないので catコマンドでproductionログを見てみることにする

cat /var/www/(アプリ名)/current/log/production.log

膨大なログをずーーーーっと眺めていると・・・

Image from Gyazo

あっ FATAL(エラー)表示を発見した。

ふむふむ 「商品の状態」 近辺でエラー発生とな
商品の状態ってここのことですな
Image from Gyazo

あーこの表示作って データを送信出来るようにモデルとマイグレーションファイル修正したわ〜 
と思い 
Image from Gyazo
:status って カラム名:state を変更したんだっけな あとint型に変更したな〜 と思いつつ

ここで気が付いた!

本番環境のデータベースそのままやんけ と。

すぐに本番環境のmysqlを確認

mysql -u root -p

データベースを見る

show databases;

データベースを指定して

use データベース名_production;

テーブルを確認

show tables;

テーブルの中身を確認

show columns from テーブル名;

で確認しました

あった

:statusに変えたはずのカラムが本番環境では :stateのままでした。

ローカル環境と本番環境でテーブルの中身が違うと本番環境では正しく表示されない 

原因特定に成功した

では次にどうするか 
本番環境でrails db:migrate を繰り返しても全然migrateされない

ま〜考えてみれば本番環境のデータベースが簡単にポンポン書き換えされちゃったら混乱するだけだから もうちっとmaigrateの方法を考えねば。

で僕が 取った方法は 

本番環境のDBを一旦リセットして もう一度作り直す!

うぉおおおおおーーーー!やってやんぜ! 本番環境のDBをぶっ壊す!

状況説明が長くなりましたが ここから本題

本番環境のデータベースをリセットする

RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop

ポイントです
意図的にproduction environmentのDBを破壊したい場合は、
環境変数 DISABLE_DATABASE_ENVIRONMENT_CHECK=1指定してあげればOKです。

DBの破壊系はコマンド実行を防止する機能がRails5以降は装備されているため
db:drop
db:drop:all
db:purge
db:purge:all
db:purge:test
db:schema:load
のコマンドはDISABLE_DATABASE_ENVIRONMENT_CHECK=1が必要です

本番環境のDBの破壊に成功した後は DBを作り直す作業

rails db:create RAILS_ENV=production

本番環境でマイグレーション

rails db:migrate RAILS_ENV=production

これでOK!
Image from Gyazo

無事本番環境のデータベース再構築完了です。

6
2
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
6
2