6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

6
Last updated at Posted at 2020-01-21

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

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

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


2026年3月 追記(最新情報)

この記事は2020年1月に投稿されました。以下に2026年3月時点の最新情報を追記します。

コマンドの変更

  • rakerails コマンド推奨: Rails 5以降、rake db:drop ではなく rails db:drop が推奨されます
  • rails db:prepare: 新しく追加されたコマンドで、DBがなければ作成、あればマイグレーションを実行します。CI/CDパイプラインでの使用に最適です

セキュリティに関する重要な注意

本番環境での db:drop最終手段です。実行前に必ず:

  1. バックアップを取得するmysqldumppg_dump でフルバックアップ)
  2. ステージング環境で検証する
  3. チームメンバーに周知する

DISABLE_DATABASE_ENVIRONMENT_CHECK=1 はRails 8でも引き続き有効ですが、このフラグを使う状況自体を避けるべきです。

推奨される代替アプローチ

DBを完全に作り直すのではなく、以下を検討してください:

  • マイグレーションファイルで差分を管理する
  • rails db:migrate:redo で特定のマイグレーションをやり直す
  • rails db:reset(schema.rbからの再構築)を使う
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?