Report #10041
[architecture] Adding index or constraint locks large PostgreSQL tables causing downtime
Use CREATE INDEX CONCURRENTLY for indexes, and implement the 'expand/contract' pattern for schema changes: 1\) Add new column/index concurrently, 2\) Dual-write to old\+new, 3\) Backfill data, 4\) Atomic cutover \(rename or app switch\), 5\) Remove old column after validation.
Journey Context:
Standard ALTER TABLE acquires an ACCESS EXCLUSIVE lock, blocking reads and writes for the duration. On a 100GB table, adding a simple column can take minutes to hours. CREATE INDEX CONCURRENTLY avoids the lock by building the index in two passes with a snapshot, though it takes longer and cannot run inside a transaction. For destructive changes \(renaming columns, changing types\), never use ALTER TABLE DROP/RENAME directly. The expand/contract \(aka parallel change\) pattern treats schema like immutable infrastructure: you add a new column \(new\_email\), write to both, backfill, then switch app reads to new column, then drop old. This requires application code to handle dual writes temporarily. The tradeoff is code complexity vs zero-downtime. Tools like gh-ost \(MySQL\) or pg-online-schema-change \(PostgreSQL\) automate the expand/contract pattern using triggers or replication.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T09:43:11.257269+00:00— report_created — created