MySQL Online Schema Change Lab
MySQL online schema change lab 的核心責任是讓讀者看到 schema change 的 metadata lock、algorithm、copy / cutover 與 validation evidence。這篇承接 Online Schema Change Tools 與 Metadata Lock Deep Dive。
本篇的範圍是在 local lab 的 accounts 上跑一次直接 ALTER TABLE、另開 session 重現 long transaction 讓 DDL 卡在 metadata lock、跑 validation query;gh-ost / pt-osc 只整理 cutover 要留的 evidence,不安裝工具。
Direct ALTER Baseline
Direct ALTER baseline 的核心責任是先看 MySQL 原生 DDL 的行為。
1mysql -h 127.0.0.1 -P 33069 -u app_user -papp_pw appdb <<'SQL'
2ALTER TABLE accounts ADD COLUMN email VARCHAR(255) NULL;
3SHOW CREATE TABLE accounts\G
4SQL記錄 ALTER duration、algorithm、lock impact 與 table size。不同 MySQL 版本與 DDL 類型會有不同行為,production 要在 staging dry run。
Metadata Lock Observation
Metadata lock observation 的核心責任是看到 blocker。
這段 lab 開三個 terminal,各自扮演一個角色:持有 transaction 的讀取 session、執行 ALTER 的 DDL session、查 performance_schema 的觀察 session。
讀取 session 用 app_user 連線,開 transaction 讀一列之後不 commit:
1-- 讀取 session(app_user)
2START TRANSACTION;
3SELECT * FROM accounts WHERE id = 1;
4-- 讀到之後停在這裡,transaction 保持開啟DDL session 同樣用 app_user 連線執行 ALTER,這一句會停住不回:
1-- DDL session(app_user)
2ALTER TABLE accounts ADD COLUMN note VARCHAR(255) NULL;觀察 session 要用 root 連線:performance_schema.metadata_locks 需要 SELECT 權限,app_user 只有 appdb 的權限,用它查會回 ERROR 1142。
1-- 觀察 session(root)
2SELECT OBJECT_SCHEMA, OBJECT_NAME, LOCK_TYPE, LOCK_STATUS, OWNER_THREAD_ID
3FROM performance_schema.metadata_locks
4WHERE OBJECT_SCHEMA = 'appdb';
5-- accounts SHARED_READ GRANTED:讀取 session 持有
6-- accounts EXCLUSIVE PENDING:DDL session 在等讀取 session 放掉完成觀察後,在讀取 session 執行 COMMIT,DDL session 的 ALTER 隨即完成。這段 lab 展示 long transaction 如何讓 DDL 等待。
OSC Frame
OSC frame 的核心責任是理解 gh-ost / pt-online-schema-change 的證據,而非要求每個 lab 都安裝工具。
OSC runbook 要記錄:
- Source table、ghost table、migration statement。
- Copy progress、chunk size、throttle condition。
- Replication lag / load threshold。
- Cutover pre-check:long transaction、metadata lock、traffic。
- Cutover duration 與 validation query。
- Rollback / drop ghost table policy。
Cutover 前最重要的是 metadata lock pre-check。工具能降低大部分 copy 風險,但最後 rename / swap 仍需要短暫鎖。
Validation
Validation 的核心責任是證明 schema change 後資料與 query 仍正確。
1mysql -h 127.0.0.1 -P 33069 -u app_user -papp_pw appdb <<'SQL'
2SELECT COUNT(*) FROM accounts;
3SELECT COUNT(*) FROM ledger_entries;
4EXPLAIN SELECT * FROM accounts WHERE tenant_id = 'tenant-a';
5SQL正式 migration 要補 row checksum、null rate、index usage、replication lag 與 application smoke test。
Release Gate
Release gate 的核心責任是形成交付 artifact。
1Migration:
2DDL / OSC command:
3Table size:
4MDL pre-check:
5Duration:
6Validation:
7Rollback:
8Owner:完成本篇後,MDL 事故讀 Metadata Lock Deep Dive;工具選型讀 Online Schema Change Tools。