前言:
我們都知道窘游,MySQL 主從延遲是一件很難避免的情況,從庫難免會(huì)偶爾追不上主庫,特別是主庫有大事務(wù)或者執(zhí)行 DDL 的時(shí)候舅巷。MySQL 除了這種正常從庫外,還可以設(shè)置延遲從庫河咽,顧名思義就是故意讓從庫落后于主庫多長(zhǎng)時(shí)間钠右,本篇文章我們一起來了解下 MySQL 中的延遲從庫。
延遲從庫介紹
延遲復(fù)制是一種特殊的復(fù)制策略忘蟹,它允許從庫在主庫執(zhí)行完數(shù)據(jù)變更后延遲一段時(shí)間再將這些變更同步到從庫飒房。這項(xiàng)功能從 MySQL 5.6 版本開始得到支持,區(qū)別于傳統(tǒng)的異步復(fù)制(接近實(shí)時(shí))媚值,比如用戶誤刪除了重要的表狠毯,延遲復(fù)制特性保證了用戶有機(jī)會(huì)從延遲的 slave 中恢復(fù)誤刪除的表。延遲特性是在 slave 中實(shí)現(xiàn)的褥芒,不會(huì)影響 master嚼松,relay log 的接收等,只是 sql_thread 執(zhí)行更新的過程延遲了指定的時(shí)間喂很。
配置延遲從庫的方法是惜颇,在從庫上執(zhí)行 STOP SLAVE; 命令暫停復(fù)制過程,然后使用 CHANGE MASTER TO MASTER_DELAY = N; 設(shè)置延遲時(shí)間(單位為秒)少辣,之后再執(zhí)行 START SLAVE; 命令重新啟動(dòng)復(fù)制過程
凌摄。在監(jiān)控延遲從庫狀態(tài)時(shí),可以通過 SHOW SLAVE STATUS \G 命令查看 SQL_Delay 和 Seconds_Behind_Master 參數(shù)漓帅,其中 SQL_Delay 表示設(shè)置的延遲時(shí)間锨亏,Seconds_Behind_Master 表示當(dāng)前從庫真正延遲的時(shí)間,正常情況下 Seconds_Behind_Master = SQL_Delay忙干。
延遲從庫使用場(chǎng)景
對(duì)比正常從庫器予,延遲從庫會(huì)落后于主庫固定的時(shí)間,比如設(shè)置 3 小時(shí)或 6 小時(shí)捐迫,這樣主庫的更新操作會(huì)在 3 小時(shí)或 6 小時(shí)后在延遲從庫執(zhí)行乾翔。想象一下,若人為或程序 bug 誤操作了數(shù)據(jù)施戴,那我們是不是可以利用延遲從庫來進(jìn)行快速恢復(fù)反浓,因?yàn)榇藭r(shí)延遲從庫還未執(zhí)行到這個(gè)誤操作的 SQL 。顯而易見赞哗,延遲從庫最大的應(yīng)用場(chǎng)景就是用于快速恢復(fù)數(shù)據(jù)雷则,對(duì)比篩選 binlog 或從備份中恢復(fù)這兩種方式,延遲從庫恢復(fù)都要簡(jiǎn)單便捷許多肪笋,特別是對(duì)于數(shù)據(jù)量比較大的實(shí)例月劈。延遲從庫恢復(fù)也有兩種情況度迂,一種是誤操作的這個(gè)表變動(dòng)很少,那么我們直接就可以在延遲從庫上備份此表猜揪,然后導(dǎo)入主庫即可惭墓。另一種情況是按時(shí)間點(diǎn)恢復(fù),首先找到誤操作語句的 GTID 或 position 點(diǎn)位而姐,然后停止延遲從庫同步進(jìn)程诅妹,取消延遲,使用 START SLAVE UNTIL 語法指定條件毅人,讓同步進(jìn)程在指定 gtid 點(diǎn)停下,這樣這個(gè)延遲從庫整體就回放到主庫誤操作前的時(shí)間點(diǎn)了尖殃,具體示例操作如下:
#在主庫找到誤操作的gtid丈莺,再往上一條gtid,設(shè)置同步截止點(diǎn)
mysql> STOP SLAVE;
mysql> change master to master_delay=0;
mysql> START SLAVE UNTIL SQL_AFTER_GTIDS='0a9a0b8b-4df3-11ed-a592-fa76892aa300:21741053';
#同步到對(duì)應(yīng)截止點(diǎn)后送丰,SQL線程會(huì)自動(dòng)停止缔俄。
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 -> 到達(dá)設(shè)定的GTID值后,SQL線程會(huì)中斷
...
Until_Condition: SQL_AFTER_GTIDS -> 設(shè)置后這里會(huì)出現(xiàn)同步截止的關(guān)鍵信息
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 -> 同步截止點(diǎn)
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
# sql線程停止代表此從庫已經(jīng)回放至誤操作前的時(shí)間點(diǎn)器躏,之后我們就能備份誤操作的表然后到主庫進(jìn)行恢復(fù)了
除了用于快速恢復(fù)外俐载,延遲從庫還有以下應(yīng)用場(chǎng)景:
- 備份和容錯(cuò):延遲從庫保留的也是一份完整的副本,可用于備份或故障切換登失。
- 離線查詢:延遲從庫可以用于離線數(shù)據(jù)處理或批量分析任務(wù)遏佣,而不影響在線服務(wù)。
- 審計(jì)和合規(guī)性:某些合規(guī)性要求可能需要保留數(shù)據(jù)的歷史版本揽浙,延遲從庫可以作為滿足這些要求的一種手段状婶。
總結(jié):
通過以上介紹可以看出,延遲從庫主要適用于需要增強(qiáng)數(shù)據(jù)安全性和提高系統(tǒng)可用性的場(chǎng)合馅巷。通過合理配置和監(jiān)控膛虫,可以有效利用延遲從庫的優(yōu)勢(shì)來增強(qiáng)數(shù)據(jù)庫系統(tǒng)的穩(wěn)定性、可靠性和性能钓猬。如果你的數(shù)據(jù)庫實(shí)例有多個(gè)從庫稍刀,不妨將其中一個(gè)設(shè)置為延遲從庫,對(duì)于快速恢復(fù)數(shù)據(jù)還是很有作用的敞曹。