Skip to content

Dress Rehearsal

ALTER TABLEのプログレスバーを4時間見つめたことがある。

決済系のサービスだった。メンテナンスウィンドウは4時間。数億行のテーブルにカラムを追加する。一瞬で終わると踏んでいた。

大丈夫ではなかった。

ALTER TABLEがメタデータの変更で済むか、テーブルの物理データを丸ごと作り直すか。その判定は見た目ほど単純ではない。MySQLのバージョン、ストレージエンジン、カラムの型、DEFAULT値、インデックス構成。条件の組み合わせで結果が変わる。その境界が直感に反する。数億行のテーブルで後者に当たると、もう祈るしかない。

祈った。

ローカルではそこそこの時間で終わっていた。だから油断した。本番はクラウドだった。

1時間経っても終わらない。2時間。3時間。メンテナンスウィンドウの枠を食い破った。10分サービスを落とせば始末書では済まないシステムだ。画面を睨みながら、何もできることがないという事実と向き合っていた。エンジニアとして最も無力な時間だった。

クラウドのディスクI/Oは読めない。AWSやGCPならまだ知見が溜まっているが、当時の本番環境は国産のクラウドだった。ディスク性能の実測値も事例もほとんど出回っていない。ローカルのリハーサルで通ったからといって、本番で同じ時間に収まる保証はどこにもなかった。

本来やるべきだったのは、ALTERを最小限に留めて、データはバッチで塗りつぶすことだ。作り直しが発生しないALTERだけ打って、投入は非同期でやる。サービスを止めなくていい。知っていた。知っていたのに、横着した。

YAGNIという言葉がある。必要になるまで作るな。ソフトウェア開発の鉄則で、わたしも基本的にはそう思う。ただしデータベースの設計だけは別だ。数億行に育ったテーブルのスキーマを変えるコストは、アプリケーションコードのリファクタリングとは桁が違う。テーブル設計は先を読むしかない。読みが外れることもあるが、読まないよりはましだ。

幸か不幸か、クラウド側の性能問題ということで先方の担当者が責を負った。わたしの会社は責められなかった。ALTERを書いたのはわたしなのに。

リハーサルは大事だが、タダではない。本番同等のデータを用意し、本番同等の環境を立てる。時間もインフラも食う。AIに任せたところで人件費が浮くだけで、ディスクI/Oのコストは変わらない。

だからカラムはなるべく先に作るようにしている。使うかどうかわからなくても。YAGNIに怒られそうだが、数億行のテーブルに後からALTERを打つよりはましだ。