目前現有的MySQL DDL 工具:
以上工具雖然工作方式並不完全相同,但都使用
trigger
將 舊表
上的異動執行到 新表
上。trigger
簡化了遷移的過程,同時也帶來了一些限制,因此有了 Triggerless design
的 gh-ost
。Overview
- Triggers, overhead:MySQL不會預編譯
trigger
,因此當查詢觸發trigger
時,除了寫入新表的開銷,同時也必須付出解釋trigger
的開銷。
- Triggers, locks:原語句與
trigger
執行的語句會處於同一個事務空間,並造成更多的鎖競爭。
- Trigger based migration, no pause:基於
trigger
的工具無法真正的暫停,因為一旦暫停將導致數據丟失。因此即使暫停複製原表的資料,繁忙的DB仍舊有可能被trigger
拖垮。
- Triggers, multiple migrations:基於以上原因,開發者認為在並行操作下更危險。
- Trigger based migration, no reliable production test:無法在生產環境下測試。
- Trigger based migration, bound to server: The trigger space is within a MySQL service. It cannot go beyond that space. We are working towards a multi-server solution. More discussion as we make progress.