Mysql

使用此方法升級數據庫架構時是否可以實現零停機?

  • January 6, 2017

我正在尋找一種實現零停機模式升級的解決方案,假設每次模式升級都與以前的應用程序版本向後兼容,這使事情變得更容易。由於數據庫已經很大,升級可能需要 2 天以上的時間才能完成,企業無法承受那麼長時間停止運營。

我在https://stackoverflow.com/a/40365479中找到了一個候選解決方案

,其步驟包括:

  • 創建臨時表
  • 在第一個表上創建觸發器(用於插入、更新、刪除),以便將它們複製到臨時表
  • 小批量,遷移數據
  • 完成後,將表重命名為新表,然後刪除另一個表

但我擔心的是它不會在最後一步導致潛在的競爭條件問題,例如,我們有原始表’users’和新表’users_new’,我們的目標是用新表替換原始表? 因為要做到這一點,是否需要執行兩個單獨的 DDL 操作,例如

刪除表使用者;ALTER TABLE users_new 重命名使用者

通過這樣做,如果在執行第 1 條和第 2 條 DDL 命令之間的時間內對使用者表執行了查詢,該怎麼辦?

pt-online-schema-changePercona Toolkit中的許多公司多年來一直在生產中使用。它不僅僅是一個候選解決方案。

它通過稍後刪除舊表來避免競爭條件。

RENAME TABLE users TO user_old, users_new TO users;
DROP TABLE users_old;

查看“第 5 步:重命名表:orig -> old, new -> orig”的原始碼

pt-osc創建三個觸發器 - 更新、刪除和插入。users因此,當從 複製到期間進行任何更改時users_new,觸發器會反映 中的更改users_new。因此,在 , 之前的片刻RENAMEusersusers_new是相同的。

引用自:https://dba.stackexchange.com/questions/159911