目前現有的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.