初始步驟檢查一下參數,並新增兩張表
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
- 在此情況下一切都照順序運行,因此不論是
INSERT
、UPDATE
、DELETE
都沒有疑慮。
對 原表DML
操作 → Binlog Apply
→ 從原表 RowCopy
INSERT
:Row Copy
被轉換為INSERT INGNORE INTO
,因此不會蓋掉Binlog Apply
的INSERT
操作。
UPDATE、DELETE
:因為還沒從原表Copy
過來,所以Binlog Apply
的操作會沒有任何結果,但是最後從原表Copy
過來時即會是最新的數據,因此也沒有問題。
對 原表DML
操作 → 從原表 RowCopy
→ Binlog Apply
INSERT
:Binlog Apply:INSERT
被轉換為REPLACE INTO
,會覆蓋掉Row Copy:INSERT
操作,但兩者的結果一樣因此不影響。
UPDATE、DELETE
:從原表Copy
過來就是最新的數據,後續的Binlog Apply
也不會影響到數據,因此也沒有問題。