LoginSignup
kou0404
@kou0404 (kodai shimomura)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Heroku、本番環境上のマイグレーションファイルについて

こんにちは。
プログラマー初学者です。
よろしくお願いします。

解決したいこと

開発環境でマイグレーションファイルを編集しました。
3つくらい前に作成したマイグレーションファイルだったので
マイグレーションファイルの日付を変更
rails db:migrate:resetでデータベースリセット
rails db:migrateでOKでした。

その後、編集を重ね
Herokuへデプロイのため
git push heroku master
heroku run rails db:migrateをすると
rails aborted!
StandardError: An error has occurred, all later migrations canceled:
というエラーが発生。

rails db:migrate:statusで確認
https://gyazo.com/8434a9be9f2ad77fd9f55a95acd5ec1d
編集前のマイグレーションファイルが NO FILE という状態で
編集後のマイグレーションファイルが down の状態でした。

開発環境と同じように
heroku run rails db:migrate:reset を実行後
heroku run rails db:migrateをしたのですが、解決できず。

編集前のファイルを削除する必要があるのでしょうか?

発生している問題・エラー

% heroku run rails db:migrate 実行

Running rails db:migrate on ⬢ cluster-board... up, run.1615 (Free)
D, [2022-05-27T06:32:46.626626 #4] DEBUG -- :    (1.8ms)  SELECT GET_LOCK('201078901223291700', 0)
D, [2022-05-27T06:32:46.639256 #4] DEBUG -- :    (1.8ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
I, [2022-05-27T06:32:46.640577 #4]  INFO -- : Migrating to CreateRooms (20220527191933)
== 20220527191933 CreateRooms: migrating ======================================
-- create_table(:rooms)
D, [2022-05-27T06:32:46.645083 #4] DEBUG -- :    (1.7ms)  SELECT @@innodb_file_per_table = 1 AND @@innodb_file_format = 'Barracuda'
D, [2022-05-27T06:32:46.651960 #4] DEBUG -- :    (2.0ms)  CREATE TABLE `rooms` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `room_name` varchar(255) NOT NULL, `category_id` int NOT NULL, `content` text NOT NULL, `user_id` bigint NOT NULL, `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL,  INDEX `index_rooms_on_user_id`  (`user_id`), CONSTRAINT `fk_rails_a63cab0c67`
FOREIGN KEY (`user_id`)
  REFERENCES `users` (`id`)
) ROW_FORMAT=DYNAMIC
D, [2022-05-27T06:32:46.653997 #4] DEBUG -- :    (1.9ms)  SELECT RELEASE_LOCK('201078901223291700')
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'rooms' already exists
/app/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:148:in `_query'
/app/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:148:in `block in query'
/app/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:147:in `handle_interrupt'
/app/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.4/lib/mysql2/client.rb:147:in `query'
/app/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.5/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:201:in `block (2 levels) in execute'
/app/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.5/lib/active_support/dependencies/interlock.rb:48:in `block in permit_concurrent_loads'
/app/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.5/lib/active_support/concurrency/share_lock.rb:187:in `yield_shares'
/app/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.5/lib/active_support/dependencies/interlock.rb:47:in `permit_concurrent_loads'
/app/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.5/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:200:in `block in execute'
/app/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.5/lib/active_record/connection_adapters/abstract_adapter.rb:728:in `block (2 levels) in log'
/app/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.5/lib/active_support/concurrency/load_interlock_aware_monitor.rb:26:in `block (2 levels) in synchronize'

以下略

% heroku run rails db:migrate:status

Running rails db:migrate:status on ⬢ cluster-board... up, run.2840 (Free)

database: heroku_ab2cad6d3bcd9a5

 Status   Migration ID    Migration Name
--------------------------------------------------
D, [2022-05-27T06:27:41.800208 #4] DEBUG -- :    (2.1ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
   up     20220519193354  Devise create users
   up     20220519224908  Create active storage tablesactive storage
   up     20220523191933  ********** NO FILE **********
   up     20220523195715  ********** NO FILE **********
   up     20220526064555  ********** NO FILE **********
  down    20220527191933  Create rooms
  down    20220527195715  Create room users
  down    20220527214555  Create messages

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

git push heroku master

heroku run rails db:migrate

heroku run rails db:migrate:reset

heroku run rails db:migrate

上から順に試してみましたが解決できませんでした。

0

1Answer

自己解決できました。

問題

Heroku上のマイグレーションファイル
********** NO FILE **********の削除方法

開発環境で不要になったマイグレーションファイルを削除すると
ヘロク上で
例 up 20190915065320 ********** NO FILE ********** となる

これを削除するには一度 up → down にして削除する必要がある
ということなので
まず開発環境上でダミーのマイグレーションファイルを作成する
20190915065320_hoge.rb を作成

中身はこんな感じ 
class Hoge < ActiveRecord::Migration[6.0]
def change
end
end

次に git push heroku master でデプロイする

その後各ダミーマイグレーションファイルをdownさせる

heroku run rails db:migrate:down VERSION=20190915065320

downさせたら 作成したダミーのマイグレーションファイルを削除

再度デプロイする
git push heroku master

次に、heroku run rails db:migrate:reset で
データベースをリセットするのだが、下記のエラーが発生
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.

どうやら、productionのDBを破壊するようなコマンドはそのままでは通らないらしい。
DISABLE_DATABASE_ENVIRONMENT_CHECK=1にして実行する。
以下にようにコマンドに続けて環境変数をセットするだけ。
$ heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1

その後、heroku run rails db:migrate:status で確認し
削除したいマイグレーションファイルの表示が消えていたらOK

0Like

Your answer might help someone💌