テーブルのスキーマの変更は、アジャイルアプローチの普及とともに重要性を増しています。プロジェクトが進化し、要件が変更されるにつれて、カラムの追加、変更、削除が必要になることが必ずあります。本番環境のデータベースでは、そのような変更は特にリスクが高いです。
構造の変更は以下のリスクを引き起こす可能性があります:
特に、他のサービスによって頻繁に使用される大きなテーブル(数百万行)での変更は難しいです。
ALTER TABLEを利用した適切な手順での変更、データのバックアップ、スタンドでのテスト、ダウンタイムの制限を行うことが重要です。トランザクションの使用、段階的な移行、大規模な変更の前のバックアップを推奨します。高負荷のDBMSでは、"online"のALTERアルゴリズムをよく利用されます。
コード例:
-- デフォルト値を持つ新しいカラムの追加 ALTER TABLE orders ADD COLUMN status VARCHAR(20) DEFAULT 'new'; -- 新しいカラムへの段階的なデータ入力 UPDATE orders SET status = CASE WHEN shipped_at IS NOT NULL THEN 'shipped' ELSE 'pending' END;
主な特徴:
ALTER TABLEは原子性を持って実行されますか?
ほとんどの場合、いいえ:テーブルの変更には多くの時間がかかる可能性があります。障害が発生した場合、一部の変更がロールバックされる一方で、一部は残存してしまうことがあります。したがって、DDLコマンドに対するトランザクション保護を実装しているDBMSは限られています(例えば、PostgreSQL)。
INTEGERからVARCHARへのカラムタイプの変更はスムーズに行えますか?
常にではありません:カラムに新しいフォーマットに適合しない古いデータが存在する場合や、関連するオブジェクト(インデックス、トリガー、キー)がある場合、DBMSはタイプ変更を許可しないか、データが損傷する可能性があります。
ALTER TABLEは常にテーブル全体に排他ロックをかけるのですか?
DBMSによります:MySQLおよび古いバージョンのSQL Serverでは、ALTER操作はしばしばテーブル全体をロックしますが、最新のDBMSは"online DDL"をサポートし、ロック時間を短縮しています。
DevOpsエンジニアは、ALTER TABLEを使用して3つの重要なテーブルに大規模な変更を加え、古いカラムを削除しました。これらのカラムに外部キーとトリガーが結びついていることを考慮しませんでした。ALTER作業中、データベースは20分間動作し続け、その間にサービスは必要なフィールドがなくなって停止しました。
利点:
欠点:
アナリストは、段階的にカラムを追加する計画を立てました:最初にデフォルトのカラムを作成し、コピーにテストロードを注入し、その後実際のALTERを夜間に行い、すべての開発者に移行ウィンドウについて通知しました。
利点:
欠点: