はじめに
前任者が構築したRails周りを確認していたら、マイグレーション履歴がおかしいことを発見しました。
①マイグレーションファイルは存在しており、マイグレーションファイル内容もDBに反映されているが、マイグレーションファイルのステータスがdownになっている。
②マイグレーションテーブル(schema_migrations)に実行履歴がない。
何故この様な状態になったのか、どの様に運用していたのか、経緯は前任者がいなくなったので確認できませんでした。
とりあえず正しい状態にするためにやったことを備忘として残しておきます。
現状確認
1.マイグレーション履歴を確認
「Status」は全てdownになっていた。
以下はサンプルであり、実際の「Migration ID」や「Migration Name」から変えています。
$ rails db:migrate:status
database: DB名
Status Migration ID Migration Name
--------------------------------------------------
down 20200101010101 Create XXX
down 20200202020202 Add column XXX
down 20200303030303 Add column XXX
down 20200404040404 Modify column XXX
・
・
・
2.マイグレーションファイルを確認
マイグレーションファイルは存在した。
$ cd db/migrate/
$ ls -l
-rw-r--r-- 1 root root 820 Apr 1 11:11 20200101010101_create_xxx.rb
-rw-r--r-- 1 root root 751 Apr 1 11:11 20200202020202_add_column_xxx.rb
-rw-r--r-- 1 root root 775 Apr 1 11:11 20200303030303_add_column_xxx.rb
-rw-r--r-- 1 root root 836 Apr 1 11:11 20200404040404_modify_column_xxx.rb
・
・
・
3.マイグレーション実行管理テーブルを確認
schema_migrationsテーブルにレコードがなかった。
mysql> SELECT * FROM schema_migrations;
Empty set (0.00 sec)
対応内容
マイグレーション履歴をupにするにはいくつか方法がありますが、schema_migrationsテーブルにレコードを追加してしまうのが一番手っ取り早いという結論に至りました。
この方法でよいかどうかは、システム運用次第であるので、ベストプラクティスではありません。
mysql> INSERT INTO schema_migrations (version) VALUES
('20200101010101'),
('20200202020202'),
('20200303030303'),
('20200404040404'),
・
・
・
;
対応後確認
1.マイグレーション履歴を確認
「Status」は全てupに変わった。
$ rails db:migrate:status
database: DB名
Status Migration ID Migration Name
--------------------------------------------------
up 20200101010101 Create XXX
up 20200202020202 Add column XXX
up 20200303030303 Add column XXX
up 20200404040404 Modify column XXX
・
・
・
2.マイグレーションファイルを確認
マイグレーションファイルに影響はない。(対応前後で変化なし)
$ cd db/migrate/
$ cd ls -l
-rw-r--r-- 1 root root 820 Apr 1 11:11 20200101010101_create_xxx.rb
-rw-r--r-- 1 root root 751 Apr 1 11:11 20200202020202_add_column_xxx.rb
-rw-r--r-- 1 root root 775 Apr 1 11:11 20200303030303_add_column_xxx.rb
-rw-r--r-- 1 root root 836 Apr 1 11:11 20200404040404_modify_column_xxx.rb
・
・
・
3.マイグレーション実行管理テーブルを確認
schema_migrationsテーブルに実行履歴レコードが存在する。
mysql> SELECT * FROM schema_migrations;
+----------------+
| version |
+----------------+
| 20200101010101 |
| 20200202020202 |
| 20200303030303 |
| 20200404040404 |
・
・
・
+----------------+
XXX rows in set (0.00 sec)
おわりに
前任者から引き継ぎを受けると、何でこんな状態になっているの?ということが往々にしてあると思いますが、自分が引き継ぐときは出来るだけ後任者に迷惑が掛からないように引き継ぎたいものである。
「立つ鳥跡を濁さず」である。
以上