對於大表,直接執行 ALTER TABLE ... MODIFY COLUMN 會導致整表重建,鎖表時間不可控,嚴重影響線上業務。本文介紹一種「換影子表」的近零停機方案。
ALTER TABLE t MODIFY col VARCHAR(8); -- 全表鎖定、重建、耗時不可控
CREATE TABLE t_shadow (LIKE t);
ALTER TABLE t_shadow MODIFY col VARCHAR(8);


FLUSH TABLES t WITH READ LOCK 關閉原表並刷新到磁碟t.frm 替換為 t_shadow.frmUNLOCK TABLES 釋放鎖SHOW CREATE TABLE t; -- 確認欄位長度已變更

ALGORITHM=INPLACE 線上 DDL,優先考慮原生功能;本技巧適用於舊版本或不支援 INPLACE 的場景。生產環境強烈建議使用 pt-online-schema-change (Percona Toolkit) 或 gh-ost (GitHub) 等成熟工具,實現真正的線上無鎖結構變更,避免手動操作風險。