初始步驟檢查一下參數,並新增兩張表
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也不會影響到數據,因此也沒有問題。