【でーたべーすまいぐれーしょん】

データベースマイグレーション とは?

💡 DBスキーマの「バージョン管理」
📌 このページのポイント
データベースマイグレーションの流れ スキーマ v1 users (id, name) orders (id, user_id) 現在の状態 マイグレーション ALTER TABLE users ADD email VARCHAR; ADD created_at DATE; スキーマ v2 users (id, name, email, created_at) orders (id, user_id) 更新後の状態 ロールバック(元に戻す) コードでスキーマ変更を管理し、バージョン管理と連携
データベースマイグレーションのイメージ
ひよこ ひよこ

なぜ手動でALTER TABLEしちゃダメなの?

ペンギン先生 ペンギン先生

手動だと「誰がいつどんな変更をしたか」の記録が残らない。チームメンバーが各自のDBに手動で変更すると食い違いが起きる。マイグレーションファイルをGitで管理すれば、全員が同じ手順で同じスキーマにできるし、問題があればロールバック(巻き戻し)もできるんだよ

ひよこ ひよこ

本番DBのマイグレーションで怖いことは?

ペンギン先生 ペンギン先生

①大きなテーブルへのALTER TABLEでロックがかかりサービスが停止する、②データ量が多いとマイグレーションに数時間かかる、③ロールバックが不完全でデータが失われる。対策としてpt-online-schema-change(MySQL)やpg_repack(PostgreSQL)でオンラインDDL変更を行うのが安全だよ

ひよこ ひよこ

マイグレーションの書き方のコツは?

ペンギン先生 ペンギン先生

①1マイグレーション1変更(カラム追加とテーブル作成を分ける)、②破壊的変更を避ける(カラム削除は「使わなくなってから削除」の2段階で)、③本番データ量を考慮(100万行のテーブルにINDEX追加は時間がかかる)、④必ずDOWNマイグレーションも書く。本番環境では事前にステージングで実行時間を確認しようね

ひよこ ひよこ

スキーマとデータの移行は別?

ペンギン先生 ペンギン先生

そう、分けて考えるべきだよ。スキーママイグレーションテーブル構造の変更)とデータマイグレーション(既存データの変換・移動)は別物。例えばfull_nameカラムをfirst_nameとlast_nameに分割する場合、①カラム追加(スキーマ)→②データ変換(データ)→③旧カラム削除(スキーマ)の3ステップで安全に進めるんだ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「DBマイグレーション」って出てきたら「DBの構造変更をコードで管理する仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Database Migration」 = データベース移行・移植
💬 Migration(移行)。スキーマをある状態から次の状態に「移行」させるよ
← 用語集にもどる