【注意】最后更新于 March 4, 2017,文中内容可能已过时,请谨慎使用。
MySQL 5.7数据库多源复制拓扑如下:
1
2
3
4
5
|
M1 --------+
|
|
v
M2 ------->S
|
M1和M2为两个主数据库实例,S为从数据库实例,建立了从M1到S和从M2到S的多源复制。
S上执行:
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
SHOW SLAVE STATUS \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: x.x.x.x
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000106
Read_Master_Log_Pos: 15847815
Relay_Log_File: relay-bin-m1.000003
Relay_Log_Pos: 15684092
Relay_Master_Log_File: binlog.000106
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: sys.%,performance_schema.%,mysql.%,information_schema.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 15847815
Relay_Log_Space: 15684290
Until_Condition: None
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: 0
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: 86
Master_UUID: @17070e4d-a4bc-49b6-88d4-cbbc610abc2b
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 134db0a3-61a4-4f96-8574-a3ec77045987:68811801-68821751
Executed_Gtid_Set: 30d1ce13-e8b0-43ae-b989-667aa0394fb8:1-240,
f7123455-4085-4e24-a028-e0cff16d1cc6:1-8409014,
f0c67103-9183-46c3-b34f-1b7fac7c0f51:1,
17070e4d-a4bc-49b6-88d4-cbbc610abc2b:1,
bb09bbce-c153-4af2-ab6f-85e70b74a13c:1-3,
cc96b6de-d317-4881-9a86-9c9b690cb8cc:1-15,
178dde0c-492c-4365-96e2-57008f2bd232:1-524521756,
da0e0547-a1ca-4cae-8db9-f3a90b3a996a:1,
134db0a3-61a4-4f96-8574-a3ec77045987:1-68821751
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name: m1
Master_TLS_Version:
*************************** 2. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: x.x.x.x
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.002584
Read_Master_Log_Pos: 127954993
Relay_Log_File: relay-bin-m2.003944
Relay_Log_Pos: 127955152
Relay_Master_Log_File: binlog.002584
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: sys.%,performance_schema.%,mysql.%,information_schema.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 127954993
Relay_Log_Space: 127955430
Until_Condition: None
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: 0
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: 69
Master_UUID: c8822a1d-d39c-11e9-8301-fa163e13923c
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 178dde0c-492c-4365-96e2-57008f2bd232:524093802-524521756
Executed_Gtid_Set: 30d1ce13-e8b0-43ae-b989-667aa0394fb8:1-240,
f7123455-4085-4e24-a028-e0cff16d1cc6:1-8409014,
f0c67103-9183-46c3-b34f-1b7fac7c0f51:1,
17070e4d-a4bc-49b6-88d4-cbbc610abc2b:1,
bb09bbce-c153-4af2-ab6f-85e70b74a13c:1-3,
cc96b6de-d317-4881-9a86-9c9b690cb8cc:1-15,
178dde0c-492c-4365-96e2-57008f2bd232:1-524521756,
da0e0547-a1ca-4cae-8db9-f3a90b3a996a:1,
134db0a3-61a4-4f96-8574-a3ec77045987:1-68821751
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name: m2
Master_TLS_Version:
2 rows in set (0.00 sec)
|
多源复制(Multi-source replication)是指在一个数据库中从多个源数据库中复制数据到同一个目标数据库的过程。要在 MySQL 中实现多源复制,需要在目标数据库中创建多个复制通道(replication channel),每个通道对应一个源数据库。每个通道都需要有独立的复制配置,包括源数据库的连接信息、复制过滤规则等。
上面的命令输出中可以看出从M1到S复制的channel名字为m1,从M2到S复制的channel名字为m2。
实践中遇到了问题,M1到S的复制出错,需要重做M1到S的复制。
- 在S上操作,停掉S上所有的SLAVE CHANNEL
- 在S上操作,查看并记录CHANNEL的
Executed_Gtid_Set
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SHOW SLAVE STATUS \G
...
Executed_Gtid_Set: 30d1ce13-e8b0-43ae-b989-667aa0394fb8:1-240,
f7123455-4085-4e24-a028-e0cff16d1cc6:1-8409014,
f0c67103-9183-46c3-b34f-1b7fac7c0f51:1,
17070e4d-a4bc-49b6-88d4-cbbc610abc2b:1,
bb09bbce-c153-4af2-ab6f-85e70b74a13c:1-3,
cc96b6de-d317-4881-9a86-9c9b690cb8cc:1-15,
178dde0c-492c-4365-96e2-57008f2bd232:1-524521756,
da0e0547-a1ca-4cae-8db9-f3a90b3a996a:1,
134db0a3-61a4-4f96-8574-a3ec77045987:1-68821751
...
|
注意从Retrieved_Gtid_Set
字段来确认在Executed_Gtid_Set
中:
134db0a3-61a4-4f96-8574-a3ec77045987:1-68821751
对应的是channel m1, 178dde0c-492c-4365-96e2-57008f2bd232:1-524521756
对应的是channel m2。
已经停掉了所有的slave,而要重做m1,因此channel m2是最重要的,一定要记录好。
- 在M1上操作,导出M1中需要被复制的数据库
具体要导出哪些数据库还是要导出全部数据库,这个由具体业务和复制规则决定。另外注意要加上--set-gtid-purged=ON
参数
1
2
3
|
mysqldump --single-transaction --default-character-set=utf8mb4 --master-data=2 --set-gtid-purged=ON -vv -E -R \
--databases db1 db2 db3 db4 \
-uroot -p > db.sql
|
将上面导出的db.sql拷贝到S上。
- 在S上操作,使用
RESET MASTER
清空二进制日志文件
RESET MASTER
用于清空二进制日志文件并重新开始记录新的二进制日志。这个命令通常用于在主从复制中,当需要重新开始复制时使用。
执行完RESET MASTER后,查询@@GLOBAL.GTID_PURGED
变量返回为空。
1
|
SELECT @@GLOBAL.GTID_PURGED;
|
- 在S上操作,将db.sql导入到S中。
此时查看@@GLOBAL.GTID_PURGED
:
1
2
3
4
|
SELECT @@GLOBAL.GTID_PURGED;
....
134db0a3-61a4-4f96-8574-a3ec77045987:1-69811800
|
注意记录上面查询中原来channel m1使用的134db0a3-61a4-4f96-8574-a3ec77045987:xxxxxxx
新的事件编号(event number)这里是1-69811800。
- 在S上操作,重新设置
@@GLOBAL.GTID_PURGED
。
在S上操作, RESET MASTER用于清空二进制日志文件(第5步导入数据产生的)并重新开始记录新的二进制日志。。
使用第2步中记录的Executed_Gtid_Set
,并将channel m1使用的134db0a3-61a4-4f96-8574-a3ec77045987:
的事件编号修改为第5步中记录的1-69811800。重新设置@@GLOBAL.GTID_PURGED
。
1
|
SET @@GLOBAL.GTID_PURGED='30d1ce13-e8b0-43ae-b989-667aa0394fb8:1-240,f7123455-4085-4e24-a028-e0cff16d1cc6:1-8409014,f0c67103-9183-46c3-b34f-1b7fac7c0f51:1,17070e4d-a4bc-49b6-88d4-cbbc610abc2b:1,bb09bbce-c153-4af2-ab6f-85e70b74a13c:1-3,cc96b6de-d317-4881-9a86-9c9b690cb8cc:1-15,178dde0c-492c-4365-96e2-57008f2bd232:1-524521756,da0e0547-a1ca-4cae-8db9-f3a90b3a996a:1,134db0a3-61a4-4f96-8574-a3ec77045987:1-69811800';
|
- 在S上操作,重新启动各个SLAVE CHANNEL
或单独启动各个CHANNEL:
1
2
|
START SLAVE FOR CHANNEL 'm1';
START SLAVE FOR CHANNEL 'm2';
|
最后使用SHOW SLAVE STATUS \G
观察各个CHANNEL是否正常,重点关注Seconds_Behind_Master
, Retrieved_Gtid_Set
, Executed_Gtid_Set
等字段的变化。