初始步驟檢查一下參數,並新增兩張表 ghost table(_gho)log&heartbeat table(_ghc)
根據 exact-rowcount 的設定來決定計算行數的方式,在 Slave 執行
通過 order by 來取得 shared key 最小值和最大值範圍
透過以下語法判斷是否還有未複製的資料
當有未複製的資料,透過下面的方式從原表複製資料到 ghost table
最後一步cut-over 階段
gh-ost 操作方式:
應用類型
原表操作
新表操作
Row Copy
SELECT
INSERT IGNORE INTO
Binlog Apply
INSERT
REPLCAE INTO
Binlog Apply
UPDATE
UPDATE 所有欄位
Binlog Apply
DELETE
DELETE
在數據遷移的過程中,數據的變動有以下三種組合:
從原表 RowCopy → 對 原表DML操作 → Binlog Apply
  • 在此情況下一切都照順序運行,因此不論是 INSERTUPDATEDELETE 都沒有疑慮。
原表DML操作 → Binlog Apply → 從原表 RowCopy
  • INSERTRow Copy 被轉換為 INSERT INGNORE INTO,因此不會蓋掉 Binlog ApplyINSERT 操作。
  • UPDATE、DELETE:因為還沒從原表 Copy 過來,所以 Binlog Apply 的操作會沒有任何結果,但是最後從原表 Copy 過來時即會是最新的數據,因此也沒有問題。
原表DML 操作 → 從原表 RowCopyBinlog Apply
  • INSERTBinlog Apply:INSERT被轉換為 REPLACE INTO,會覆蓋掉 Row Copy:INSERT 操作,但兩者的結果一樣因此不影響。
  • UPDATE、DELETE:從原表 Copy 過來就是最新的數據,後續的 Binlog Apply 也不會影響到數據,因此也沒有問題。