1. 程式人生 > 實用技巧 >MySQL主從之延時複製

MySQL主從之延時複製

目錄

一、延時複製

延時從庫只做備份,不提供任何對外服務,正常情況下我們是不會有刻意延遲從庫的需求的,因為正常的線上業務自然是延遲越低越好。
但是針對測試場景,業務上偶爾需要測試延遲場景下業務是否能正常執行。

# 延時複製流程:
和非同步複製類似,同樣是將主庫的binlog日誌通過dump執行緒傳送給從庫的中繼日誌中,但是當執行SQL的執行緒時,
會根據配置的延時複製時長,sql執行緒等到了延遲時間之後再執行中繼日誌中的sql語句了。

# 注意:
延時從庫恢復資料時不要關閉主庫的binlog,實際上從庫還是會執行主庫執行錯的語句,只不過又執行了重建語句

1.配置延時複製(已經有主從)

1.停止主從
mysql> stop slave;
Query OK, 0 rows affected (0.03 sec)

2.配置延時時間
mysql> change master to master_delay=180;
Query OK, 0 rows affected (0.01 sec)

3.開啟主從
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

2.配置延時複製(沒有主從)

1.搭建出一臺mysql
2.配置主從
mysql> change master to
    -> master_host='172.16.1.51',
    -> master_user='rep',
    -> master_password='123',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=424,
    -> master_delay=180;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
3.開啟執行緒
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

3.關閉延時從庫

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> change master to master_delay=0;
Query OK, 0 rows affected (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.02 sec)

例項

#關於延時複製如何恢復思考問題:
總資料量級500G,正常備份去恢復需要1.5-2小時
1)配置延時3600秒
mysql>CHANGE MASTER TO MASTER_DELAY = 3600;

2)主庫
drop database db;

3)怎麼利用延時從庫,恢復資料?
提示:
1、從庫relaylog存放在datadir目錄下
2、mysqlbinlog 可以擷取relaylog內容
3、show relay log events in 'db01-relay-bin.000001';


#處理的思路:
1)停止SQL執行緒
mysql> stop slave sql_thread;

2)擷取relaylog到誤刪除之前點
relay-log.info 獲取到上次執行到的位置點,作為恢復起點
分析relay-log的檔案內容,獲取到誤刪除之前position
模擬故障處:

1)關閉延時
mysql -S /data/3308/mysql.sock
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_DELAY = 0;
mysql> start slave;

2)模擬資料
mysql -S /data/3307/mysql.sock
source  /root/world.sql
use world;
create table c1 select * from city;
create table c2 select * from city;

3)開啟從庫延時5分鐘
mysql -S /data/3308/mysql.sock
show slave status \G
mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY = 300;
mysql>start slave;
mysql -S /data/3307/mysql.sock
use world;
create table c3 select * from city;
create table c4 select * from city;

4)破壞,模擬刪庫故障。(以下步驟在5分鐘內操作完成。)
mysql -S /data/3307/mysql.sock
drop database world;

5)從庫,關閉SQL執行緒
mysql -S /data/3308/mysql.sock
stop slave sql_thread;

6)擷取relay-log
起點:
cd /data/3308/data/
cat relay-log.info
./db01-relay-bin.000002
283
終點:
mysql -S /data/3308/mysql.sock
show relaylog events in 'db01-relay-bin.000002'
db01-relay-bin.000002 | 268047 
mysqlbinlog --start-position=283  --stop-position=268047 /data/3308/data/db01-relay-bin.000002 >/tmp/relay.sql 
恢復relay.sql

1)取消從庫身份
mysql> stop slave;
mysql> reset slave all;

2)恢復資料
mysql> set sql_log_bin=0;
mysql> source /tmp/relay.sql
mysql> use world
mysql> show tables;