MySQL 延遲複製

1、什麼是延遲複製

延遲複製就是將 Slaves 節點與 Master 節點保持指定時間的複製間隔。
所謂的延遲 ,只是對 SQL_Thread 的線程的延遲。IO_Thread 主庫發生的任何操做的日誌都會同步到 slave,也就是說 IO_Thread 線程和主庫是沒有延遲的。只是 SQL_Thread 與主庫有延遲。只是執行時間延遲,而不是讀取 binlog 時間延遲。mysql

2、延遲複製使用場景

(1) 利用延遲複製作誤操做恢復
提供 Master 節點意外錯誤的快速恢復機制,若 Master 節點出現誤改、誤刪等操做,形成數據丟失的狀況,因爲 Slave 節點有延遲因素的存在,那麼咱們 DBA 能夠經過 Slave 節點仍然保存的數據,快速地將之恢復回去。不過一般延遲時間不會太長,若是出現誤操做,並且 Slave 節點剛好尚未應用這些事件,那就必須爭分奪秒進行恢復才能夠。
(2) 測試複製環境出現延遲時,評估對系統應用可能形成的影響。sql

3、啓用延遲複製

啓用延遲複製很是簡單,只須要指定 Slave 節點中 MASTER_DELAY 的選項值便可,語句以下:測試

stop slave sql_thread;
change master to master_delay=N;  #N 單位秒
start slave;

設置完成以後,START SLAVE 就可使之生效,無需從新啓動 MySQL 服務。
這樣設置了以後,Slaves 節點接收到 Master 節點生成的二進制日誌,不會立刻應用,而是等待,直到時間符合設定的延遲條件後纔開始應用。spa

4、延遲複製狀態查看

Slave 開通延遲複製後,Slave 節點應用狀態如何,咱們能夠經過 SHOW SLAVE STATUS\G 查看如下 3 個狀態值便可。線程

  • SQL_Delay:顯示當前設定的延遲時間,以秒爲單位。
  • SQL_Remaining_Delay: 當 Slave_SQL_Running_State 列的狀態是「Waiting until MASTER_DELAY seconds after master executed event''時,本列顯示的值就是距離延遲閾值的時間,也就是說還有多長時間才能開始應用,不然本列值應該是 NULL。複製完成後沒有可複製的 events 時這個值就是 NULL。日誌

  • Slave_SQL_Running_State: 該值顯示的是當前 SQL_THREAD 的狀態;code

該值通常會有兩種狀況:
當 SQL_THREAD 沒有處於延遲等待階段時顯示:Slave has read all relay log; waiting for more updates
當 SQL_THREAD 處於延遲等待階段,SHOW SLAVE STATUS\G 或者 SHOW PROCESSLIST 顯示該進程的狀態將會是:Waiting until MASTER_DELAY seconds after master executed event進程

我在 master 上執行了一個語句後,查看 slave 狀態事件

mysql> show slave status\G
.........
                    SQL_Delay: 300  
          SQL_Remaining_Delay: 54
      Slave_SQL_Running_State: Waiting until MASTER_DELAY seconds after master executed event
..........

說明一下:我設置的是 300 秒延遲複製,master_delay=30。因此上面顯示 SQL_Delay:300
SQL_Remaining_Delay: 54 表示還有 54 秒後才能夠應用 master 上執行的語句。
複製完成後 slave 狀態:同步

mysql> show slave status\G
                    SQL_Delay: 300
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

5、怎麼從延遲複製變爲不延遲複製

只須要把 master_delay 的值改成 0 便可。

mysql> stop slave sql_thread;
mysql> change master to master_delay=0;
mysql> start slave;

6、延遲複製恢復數據方法和步驟

(1)主庫出現誤操做後,首先咱們把 sql_thread 線程中止執行,並把延遲複製 master_delay 這個值改成 0,表示取消延遲複製;

mysql> stop slave sql_thread;
mysql> change master to master_delay=0;

(2)讓 sql_thread 執行到出現問題以前中止;

start slave  sql_thread until master_log_file='xxxx',master_log_pos='xxxxx';

(3)而後把 slave 庫上恢復的數據使用 mysqldump 備份出來;
(4)把 mysqldump 備份的數據導入到 master 庫上;
到此數據恢復成功;

若是數據太大,例如 1TB 數據,咱們應該怎麼傳輸這些數據。咱們可使用 rsync 傳輸數據。