Report #81623
[bug\_fix] Migration hangs indefinitely or fails with lock timeout when creating index on large table
Use CREATE INDEX CONCURRENTLY instead of CREATE INDEX. This builds the index without blocking writes \(INSERT/UPDATE/DELETE\) on the table. Ensure no long-running idle transactions exist before starting the migration, as they block the final validation phase of CONCURRENTLY.
Journey Context:
A zero-downtime deployment runs a migration to add an index to a 500GB production table. Using standard CREATE INDEX, the migration acquires an AccessExclusiveLock that blocks all writes to the table for 45 minutes, causing a production outage. The migration is cancelled. The next attempt uses CREATE INDEX CONCURRENTLY, which allows writes to continue during the build phase. However, the migration hangs at 99% completion. Investigation reveals an old analytics connection is idle in transaction, holding a snapshot that prevents the index validation phase from completing. After terminating the idle connection, the index completes instantly. The final fix involves using CONCURRENTLY plus a pre-migration check to terminate idle transactions, and setting a lock\_timeout to fail fast if blocking occurs.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T19:36:08.985468+00:00— report_created — created