首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 兩表名原子互換:雙表鎖定 + ALTER RENAME 實現零停機切換

     編輯:MySQL 綜合教學

業務場景

類似 pt-online-schema-change (pt-osc) 結束階段,需將臨時表 t_new 與原表 t_old 原子互換,保證無寫入丟失、無鎖阻塞業務。

標準解法:雙表寫鎖 + 三步改名

方案缺點
RENAME TABLE t_old TO t_tmp, t_new TO t_old, t_tmp TO t_new;單語句原子,但不支持加鎖,間隙期寫入會丟失/報錯
先 RENAME t_old TO t_tmp,再 RENAME t_new TO t_old兩步之間有窗口,寫入會落入 t_tmp 或報表不存在
建視圖切換視圖不支持索引/鎖/觸發器,性能與功能受限


適用場景擴展

  • pt-osc / gh-ost 結束階段切換
  • 藍綠部署數據庫層面切換
  • 分區表與非分區表互換
  • 備份表與線上表數據校驗後切換

注意事項

  1. 需同一會話執行 LOCK/ALTER/UNLOCK,否則鎖釋放
  2. 表名不區分大小寫(Windows)或區分(Linux),按實際情況寫
  3. 外鍵引用表名不會自動更新,需應用層協調或禁用 FK
  4. 觸發器/存儲過程引用表名同理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved