MySQL主從之延時複製
阿新 • • 發佈:2020-07-25
目錄
一、延時複製
延時從庫只做備份,不提供任何對外服務,正常情況下我們是不會有刻意延遲從庫的需求的,因為正常的線上業務自然是延遲越低越好。 但是針對測試場景,業務上偶爾需要測試延遲場景下業務是否能正常執行。 # 延時複製流程: 和非同步複製類似,同樣是將主庫的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;