在類似 pt-online-schema-change(pt-osc)的線上變更場景中,經常需要將兩張表的名稱進行原子性互換。若採用先後執行 RENAME 的方式,中間間隙會導致寫入失敗,如何確保萬無一失?
MySQL 官方文檔提供了標準做法:同時對兩張表加持寫鎖,禁止寫入,再執行三步 RENAME 操作。具體語句如下:
LOCK TABLES t1 WRITE, t2 WRITE; ALTER TABLE t1 RENAME TO t3; ALTER TABLE t2 RENAME TO t1; ALTER TABLE t3 RENAME TO t2; UNLOCK TABLES;
整個過程在鎖保護下完成,對業務影響極小,適合線上高併發環境。
採用「雙表寫鎖 + 三步 RENAME」即可安全完成表名互換,避免數據寫入失敗風險,是 MySQL 運維必備技巧。