1. 程式人生 > 其它 >mysql延時複製

mysql延時複製

目錄

1.延遲複製

人為配置的,讓從庫延遲sql執行緒的回放動作

設定從庫sql_thread延時回放,使得從庫晚於主庫執行;

1.1為什麼從要延遲複製

刪除資料時能更快恢復

主庫刪除後,讓延遲的從庫在誤操作前的時間點停下,然後進行恢復

因為恢復全備恢復binlog往往會更加耗時

1.2延遲配置

開啟延遲複製:

change master to master_delay=60;

master_delay的值預設為0,單位為秒,範圍在[0,232-1],官方文件參考
一般建議1-6小時,根據反映時間稍作調整

#在配置主從時就可以加上,或者停止sql執行緒後在配置
#開啟延遲複製:
stop slave sql_thread;
change master to master_delay=60;
start slave sql_thread;

#關閉延遲複製:
stop slave sql_thread;
change master to master_delay=0;
start slave sql_thread;

#8.0之後可以直接change master to master_delay=60;不用再重啟sql執行緒

#檢視狀態
show slave status\G
......
                    SQL_Delay: 60
          SQL_Remaining_Delay: NULL
......

2.延遲複製恢復案例

有一主一從,從庫延遲主庫5分鐘,主庫誤操作,刪除了一個庫

2.1恢復思路:

  1. 5分鐘之內,知道了誤刪除操作
  2. 在延遲的5分鐘之內,立即停止從庫的sql執行緒
  3. 從庫show slave status找到正在使用的relaylog(Relay_Log_File)和起點(Relay_Log_Pos)
  4. 從庫show relaylog events in 'Relay_Log_File檔案',找到刪除語句的Pos點(終點)
  5. 擷取起點和終點的relaylog日誌,恢復到從庫
  6. 將從庫作為主庫,替代主庫工作

2.2故障模擬和恢復

1.主庫進行資料操作

create database db_test;
use db_test;
create table t1(id int);
insert into t1 values(1),(2),(3);
drop database db_test;

2.從庫在延遲時間內停止sql執行緒

stop slave sql_thread;

3.找到並擷取relaylog的起點和終點

#找起點
show slave status\G
......
Relay_Log_File: localhost-relay-bin.000004
Relay_Log_Pos: 517
......
#起點517和使用的relaylog檔案localhost-relay-bin.000004

------------------------------------------------------------------------------

#找終點
show relaylog events in 'localhost-relay-bin.000004';
······
Log_name                   | Pos  | Event_type     | Server_id | End_log_pos | Info
localhost-relay-bin.000004 | 1211 | Query          |         1 |        1099 | drop database db_test
······

#終點在1211

------------------------------------------------------------------------------


#擷取relaylog
#--skip-gtids 這個引數避免的冪等性,就是告訴GTID不要檢查歷史事務了,直接操作就行了
#冪等性,比如說恢復GTID的1-5號事務,檢查自己發現有1-5號事務,重複衝突,就不操作了。
#--skip-gtids不保留主庫的gtid,把它當做新的事務執行
#如果沒有使用--skip-gtids,到恢復的時候,可能導致gtid號衝突而失敗


mysqlbinlog --start-position=517 --stop-position=1211  /data/mysqldata/localhost-relay-bin.000004>/tmp/relay.sql

------------------------------------------------------------------------------

#從庫上恢復binlog
set sql_log_bin=0;
source /tmp/relay.sql;
set sql_log_bin=1;

#如果從庫也開啟了binlog,注意binlog重複,先不寫binlog,確認無誤之後再寫入binlog