バックエンド・API・データ · 上級
ダウンタイムなしのスキーマ移行
一行でいうと: 後方互換性のあるステップでスキーマを変更する:追加し、埋め、切り替え、最後にのみ——削除する。
問題
リリース中は二つのコードバージョンが一緒に実行される。一度にカラムを変更する移行はどちらかを壊す。なので、すべての構造的変更はそれぞれが単独で安全なステップのシーケンスに分解される。
安全なシーケンス
追加。新しいカラム、NULLを許可、既存のものに触らない。
二重書き込み。コードは両方のカラムに書き込み、古いものから読むことを好む。
バックフィル。小さなバッチで、ピーク時間外に、停止できる機能を持って。
読み取り切り替え。データが同一であることを確認後。
削除。誰も読んでいないことを確認した後の別のリリースで。
注意ルール
大きなテーブルへの移行はロックする可能性がある。エンジンのロック動作を確認し、本番サイズのコピーで実行する。前のバックアップ、プレッシャー下で即興されるのではなく事前に書かれたロールバックスクリプト。
さらに深く
自動実行と順序制御でバージョン管理のコードとして移行を管理する。スキーマ変更と同じリリースでロジック変更を混ぜない:何かが壊れたとき、どちらが原因かを知りたい。