Mysql
使用此方法升級數據庫架構時是否可以實現零停機?
我正在尋找一種實現零停機模式升級的解決方案,假設每次模式升級都與以前的應用程序版本向後兼容,這使事情變得更容易。由於數據庫已經很大,升級可能需要 2 天以上的時間才能完成,企業無法承受那麼長時間停止運營。
我在https://stackoverflow.com/a/40365479中找到了一個候選解決方案
,其步驟包括:
- 創建臨時表
- 在第一個表上創建觸發器(用於插入、更新、刪除),以便將它們複製到臨時表
- 小批量,遷移數據
- 完成後,將表重命名為新表,然後刪除另一個表
但我擔心的是它不會在最後一步導致潛在的競爭條件問題,例如,我們有原始表’users’和新表’users_new’,我們的目標是用新表替換原始表? 因為要做到這一點,是否需要執行兩個單獨的 DDL 操作,例如
刪除表使用者;ALTER TABLE users_new 重命名使用者
通過這樣做,如果在執行第 1 條和第 2 條 DDL 命令之間的時間內對使用者表執行了查詢,該怎麼辦?
pt-online-schema-change
Percona 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
。因此,在 , 之前的片刻RENAME
,users
和users_new
是相同的。