0Pricing
SQL Academy · レッスン

オンラインマイグレーション:ALTER TABLEがロックする理由

どのALTER TABLE形式がACCESS EXCLUSIVEロックを取得してテーブルを書き換えるのか、どれがメタデータの変更だけで済むのかを理解します。

「オンラインマイグレーション:ALTER TABLEがロックする理由」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

本番環境でのマイグレーション問題

小さなDBでは、ALTER TABLEは瞬時に完了します。しかし、稼働中の500GBのテーブルでは、同じコマンドによって書き込みが20分間ロックされる可能性があります。どのALTERが安全で、どれが危険なのかを知ることが不可欠です。

ロックレベル

PostgreSQLのロックには次のレベルがあります。

  • ACCESS SHARE — SELECT
  • ROW EXCLUSIVE — 書き込み
  • SHARE / SHARE ROW EXCLUSIVE — 読み取りと共存するDDL
  • EXCLUSIVE — SELECTをブロック
  • ACCESS EXCLUSIVE — すべてをブロック

ALTER TABLE が取得するロック

ほとんどのALTERはACCESS EXCLUSIVEを取得するため、完了するまで読み取りと書き込みをブロックします。

高速(メタデータのみの)ALTER

一部のALTERはカタログのみを変更するため、巨大なテーブルでも数ミリ秒で完了します。

ALTER TABLE t RENAME COLUMN a TO b;
ALTER TABLE t ALTER COLUMN a SET DEFAULT ...;
ALTER TABLE t ADD COLUMN x INT;             -- nullable, no default: metadata only (PG 11+)
ALTER TABLE t ADD COLUMN x INT NOT NULL DEFAULT 0;  -- metadata only PG 11+ if default is constant

低速(テーブルを書き換える)ALTER

次のALTERはテーブル全体を書き換えます。

ALTER TABLE t ALTER COLUMN x TYPE BIGINT;     -- when types not binary-compatible
ALTER TABLE t SET LOGGED;
CLUSTER t USING idx;                          -- physically reorders rows
VACUUM FULL t;                                -- rewrites whole table

NOT NULL の安全な追加

大きなテーブルの場合は、次のようにします。

-- BAD: full table scan + ACCESS EXCLUSIVE lock
ALTER TABLE t ALTER COLUMN x SET NOT NULL;

-- BETTER:
ALTER TABLE t ADD CONSTRAINT x_not_null CHECK (x IS NOT NULL) NOT VALID;
ALTER TABLE t VALIDATE CONSTRAINT x_not_null;     -- scans without exclusive lock
-- then drop the CHECK and add NOT NULL (still cheap because already validated):
ALTER TABLE t ALTER COLUMN x SET NOT NULL;
ALTER TABLE t DROP CONSTRAINT x_not_null;

外部キーのオンライン追加

同じNOT VALIDの手法を使います。

ALTER TABLE orders
  ADD CONSTRAINT orders_user_fk FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_fk;

ロック待ちの問題

ACCESS EXCLUSIVEロックを待機しているALTERは、実行時間の長いすべてのトランザクションの後ろに並びます。新しいトランザクションもALTERの後ろで待機するため、ブロックされたクエリの連鎖が発生します。

lock_timeout

マイグレーションをいつまでも待機させないようにします。

SET lock_timeout = '5s';
ALTER TABLE t ...;
-- ERROR if it can't get the lock in 5s — retry.

リトライループ

マイグレーションでは、lock_timeoutが発生したらリトライするようにします。

for (let i = 0; i < 20; i++) {
  try {
    await client.query('SET lock_timeout = 5000');
    await client.query('ALTER TABLE ...');
    break;
  } catch (e) {
    if (e.code === '55P03') continue;     // lock_not_available
    throw e;
  }
}

安全のための statement_timeout

マイグレーション内で1つのステートメントを実行できる時間に上限を設定します。

SET statement_timeout = '30s';

役立つツール

  • strong_migrations(Rails)
  • django-migrate-zero-downtime
  • pg-osc(Postgres Online Schema Change)
  • pgRoll

まとめ

オンラインマイグレーションでは、次の点を意識する必要があります。

  • どのALTERがメタデータのみを変更し、どれがテーブルを書き換えるか
  • 制約にはNOT VALID + VALIDATEを使う
  • lock_timeoutを設定してリトライする
  • マイグレーションをブロックする長時間実行トランザクションを避ける

クイックチェック

500GBのテーブルに対して、1回のALTER TABLEでNOT NULL制約を追加すると、書き込みはどうなるでしょうか。

よくある質問

「オンラインマイグレーション:ALTER TABLEがロックする理由」レッスンは無料ですか?

はい。「オンラインマイグレーション:ALTER TABLEがロックする理由」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「オンラインマイグレーション:ALTER TABLEがロックする理由」で何を学びますか?

どのALTER TABLE形式がACCESS EXCLUSIVEロックを取得してテーブルを書き換えるのか、どれがメタデータの変更だけで済むのかを理解します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「オンラインマイグレーション:ALTER TABLEがロックする理由」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. オンラインマイグレーション:ALTER TABLEがロックする理由
  2. 並行インデックス作成(CREATE INDEX CONCURRENTLY)
  3. ダウンタイムゼロの列名変更
  4. ツール:Flyway、Liquibase、Sqitch
← SQL Academyに戻る