天天看點

延時複制 delayed replication

mysql5.6開始支援延時複制,預設master_delay為0秒,

CHANGE MASTER TO MASTER_DELAY = N;

表示延時N秒

原理:延時複制的本質是sql_thread需要等待延時時間之後才能執行。

延時複制适用場景:

(1)防止主庫誤操作,在複制同步之前,可以停止同步

(2)用作測試

(3)用來檢查資料庫以前的資料

reset slave會把master_delay清零;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

<code>建立一個延時複制:</code>

<code>slave:</code>

<code>root@localhost [testdb]&gt;stop slave;</code>

<code>root@localhost [testdb]&gt;change master </code><code>to</code> <code>master_delay=60;</code>

<code>root@localhost [testdb]&gt;start slave;</code>

<code>root@localhost [testdb]&gt;show slave status\G</code>

<code>......</code>

<code>                    </code><code>SQL_Delay: 60  </code><code>--延時時間</code>

<code>          </code><code>SQL_Remaining_Delay: 56           </code><code>--剩餘時間</code>

<code>      </code><code>Slave_SQL_Running_State: Waiting until MASTER_DELAY seconds </code><code>after</code> <code>master executed event   </code><code>--等待延時</code>

<code>master:</code>

<code>root@localhost [testdb]&gt;</code><code>delete</code> <code>from</code> <code>t1 </code><code>where</code> <code>c1=4;</code>

<code>slave:</code>

<code>root@localhost [testdb]&gt;</code><code>select</code> <code>* </code><code>from</code> <code>t1;</code>

<code>+</code><code>----+------+</code>

<code>| c1 | c2   |</code>

<code>|  1 | aaa  |</code>

<code>|  2 | bbb  |</code>

<code>|  3 | ccc  |</code>

<code>|  4 | ddd  |</code>

<code>root@localhost [testdb]&gt;show processlist;</code>

<code>+</code><code>----+-------------+-----------+--------+---------+------+----------------------------------------------------------------+------------------+</code>

<code>| Id | </code><code>User</code>        <code>| Host      | db     | Command | </code><code>Time</code> <code>| State                                                          | Info             |</code>

<code>| 26 | root        | localhost | testdb | Query   |    0 | starting                                                       | show processlist |</code>

<code>| 27 | system </code><code>user</code> <code>|           | </code><code>NULL</code>   <code>| </code><code>Connect</code> <code>|  345 | Waiting </code><code>for</code> <code>master </code><code>to</code> <code>send event                               | </code><code>NULL</code>             <code>|</code>

<code>| 28 | system </code><code>user</code> <code>|           | </code><code>NULL</code>   <code>| </code><code>Connect</code> <code>|   10 | Waiting until MASTER_DELAY seconds </code><code>after</code> <code>master executed event | </code><code>NULL</code>             <code>|</code>

<code>#在沒有達到60秒之前檢視relay-log日志,發現已經寫入relay-lo中,說明延時是阻塞SQL_thread線程</code>

<code>[root@Darren1 data]# mysqlbinlog -vv </code><code>--base64-output=decode-rows relay-bin.000003</code>

<code>BEGIN</code>

<code>/*!*/;</code>

<code># </code><code>at</code> <code>452</code>

<code>#170409 22:12:27 server id 330622  end_log_pos 5624 CRC32 0x86f7edf4    Table_map: `testdb`.`t1` mapped </code><code>to</code> <code>number 147</code>

<code># </code><code>at</code> <code>502</code>

<code>#170409 22:12:27 server id 330622  end_log_pos 5668 CRC32 0x697c52ed    Delete_rows: </code><code>table</code> <code>id 147 flags: STMT_END_F</code>

<code>### </code><code>DELETE</code> <code>FROM</code> <code>`testdb`.`t1`</code>

<code>### </code><code>WHERE</code>

<code>###   @1=3 /* </code><code>INT</code> <code>meta=0 nullable=0 is_null=0 */</code>

<code>###   @2=</code><code>'ccc'</code> <code>/* VARSTRING(30) meta=30 nullable=1 is_null=0 */</code>

本文轉自 Darren_Chen 51CTO部落格,原文連結:http://blog.51cto.com/darrenmemos/1921702,如需轉載請自行聯系原作者

繼續閱讀