MySQL 延遲從庫介紹

MySQL技术發表於2024-08-29

前言:

我們都知道,MySQL 主從延遲是一件很難避免的情況,從庫難免會偶爾追不上主庫,特別是主庫有大事務或者執行 DDL 的時候。MySQL 除了這種正常從庫外,還可以設定延遲從庫,顧名思義就是故意讓從庫落後於主庫多長時間,本篇文章我們一起來了解下 MySQL 中的延遲從庫。

延遲從庫介紹

延遲複製是一種特殊的複製策略,它允許從庫在主庫執行完資料變更後延遲一段時間再將這些變更同步到從庫。這項功能從 MySQL 5.6 版本開始得到支援,區別於傳統的非同步複製(接近實時),比如使用者誤刪除了重要的表,延遲複製特性保證了使用者有機會從延遲的 slave 中恢復誤刪除的表。延遲特性是在 slave 中實現的,不會影響 master,relay log 的接收等,只是 sql_thread 執行更新的過程延遲了指定的時間。

配置延遲從庫的方法是,在從庫上執行 STOP SLAVE; 命令暫停複製過程,然後使用 CHANGE MASTER TO MASTER_DELAY = N; 設定延遲時間(單位為秒),之後再執行 START SLAVE; 命令重新啟動複製過程
。在監控延遲從庫狀態時,可以透過 SHOW SLAVE STATUS \G 命令檢視 SQL_Delay 和 Seconds_Behind_Master 引數,其中 SQL_Delay 表示設定的延遲時間,Seconds_Behind_Master 表示當前從庫真正延遲的時間,正常情況下 Seconds_Behind_Master = SQL_Delay。

延遲從庫使用場景

對比正常從庫,延遲從庫會落後於主庫固定的時間,比如設定 3 小時或 6 小時,這樣主庫的更新操作會在 3 小時或 6 小時後在延遲從庫執行。想象一下,若人為或程式 bug 誤操作了資料,那我們是不是可以利用延遲從庫來進行快速恢復,因為此時延遲從庫還未執行到這個誤操作的 SQL 。顯而易見,延遲從庫最大的應用場景就是用於快速恢復資料,對比篩選 binlog 或從備份中恢復這兩種方式,延遲從庫恢復都要簡單便捷許多,特別是對於資料量比較大的例項。延遲從庫恢復也有兩種情況,一種是誤操作的這個表變動很少,那麼我們直接就可以在延遲從庫上備份此表,然後匯入主庫即可。另一種情況是按時間點恢復,首先找到誤操作語句的 GTID 或 position 點位,然後停止延遲從庫同步程序,取消延遲,使用 START SLAVE UNTIL 語法指定條件,讓同步程序在指定 gtid 點停下,這樣這個延遲從庫整體就回放到主庫誤操作前的時間點了,具體示例操作如下:

#在主庫找到誤操作的gtid,再往上一條gtid,設定同步截止點
mysql> STOP SLAVE;
mysql> change master to master_delay=0;
mysql> START SLAVE UNTIL SQL_AFTER_GTIDS='0a9a0b8b-4df3-11ed-a592-fa76892aa300:21741053';
 
#同步到對應截止點後,SQL執行緒會自動停止。
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.10.97
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: bin-log.000151
          Read_Master_Log_Pos: 39510957
               Relay_Log_File: relay-log.000004
                Relay_Log_Pos: 35271037
        Relay_Master_Log_File: bin-log.000151
             Slave_IO_Running: Yes
            Slave_SQL_Running: No -> 到達設定的GTID值後,SQL執行緒會中斷
...
              Until_Condition: SQL_AFTER_GTIDS -> 設定後這裡會出現同步截止的關鍵資訊
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 60859881
                  Master_UUID: 0a9a0b8b-4df3-11ed-a592-fa76892aa300
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
...
           Retrieved_Gtid_Set: 0a9a0b8b-4df3-11ed-a592-fa76892aa300:21562347-21747364
            Executed_Gtid_Set: 0a9a0b8b-4df3-11ed-a592-fa76892aa300:1-21741053 -> 同步截止點
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
# sql執行緒停止代表此從庫已經回放至誤操作前的時間點,之後我們就能備份誤操作的表然後到主庫進行恢復了

除了用於快速恢復外,延遲從庫還有以下應用場景:

  • 備份和容錯:延遲從庫保留的也是一份完整的副本,可用於備份或故障切換。
  • 離線查詢:延遲從庫可以用於離線資料處理或批次分析任務,而不影響線上服務。
  • 審計和合規性:某些合規性要求可能需要保留資料的歷史版本,延遲從庫可以作為滿足這些要求的一種手段。

總結:

透過以上介紹可以看出,延遲從庫主要適用於需要增強資料安全性和提高系統可用性的場合。透過合理配置和監控,可以有效利用延遲從庫的優勢來增強資料庫系統的穩定性、可靠性和效能。如果你的資料庫例項有多個從庫,不妨將其中一個設定為延遲從庫,對於快速恢復資料還是很有作用的。

相關文章