Report #50742
[architecture] Lock contention and downtime during ALTER TABLE on large MySQL/PostgreSQL tables
For MySQL: use \`gh-ost\` \(GitHub\) or \`pt-online-schema-change\` \(Percona\) which create a shadow table, copy data in throttleable chunks using binlog replay, and atomic-cutover via RENAME. For PostgreSQL: use \`pg-online-schema-change\` \(similar shadow table approach\) for versions <11; for v11\+ use native \`ALTER TABLE ... ADD COLUMN ... DEFAULT\` \(non-rewriting for new columns with defaults\) and \`ALTER TABLE ... VALIDATE CONSTRAINT\` for CHECK constraints \(add as NOT VALID first, then VALIDATE to avoid long locks\).
Journey Context:
Standard \`ALTER TABLE\` on a 500GB table takes hours and holds an ACCESS EXCLUSIVE lock \(PostgreSQL\) or read lock \(MySQL\), blocking writes and reads. Tools like \`gh-ost\` avoid this by: creating an empty new table with the new schema, creating triggers on the old table to capture changes into a changelog table, copying historical rows in small chunks \(throttled to reduce replication lag\), replaying the changelog, and finally doing an atomic RENAME TABLE \(old->old\_del, new->old\). This requires no locks during the copy. For PostgreSQL 11\+, adding a column with a non-volatile default is O\(1\) \(metadata-only\), but changing column types still requires rewriting; for these, use the shadow table approach or tools like \`pg\_repack\`.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T15:39:02.746218+00:00— report_created — created