mysql 复制架构变更方法
DB角色:
主 库:A
从库1:B
从库2:C
一主两从变成级联复制
架构:
具体过程如下:
原架构:
A 主库
B 从库1
C 从库2
修改为:
A 主库
B 从库1(是C的Master)
C 从库2
#1. 先停掉C的复制,stop slave;并查看c的复制进度。
# 过段时间查看B的复制进度,超过C的复制进度就可以停B库的复制进度。
#2.停掉B库的复制进度后,查看b库的show master status;并查看他对于A库的复制进度
#之后,就可以重新启动B库的复制了,这个时候,
#3.在C库上操作,他现在主库是A库,从新开启A库的复制进程,应用binlog到B库停止时候的复制进度为止,
#语句是:start slave until master_log_file='tex-bin.003882',master_log_pos=322474479;
mysql> start slave until master_log_file='mysql-bin.000047',master_log_pos=12856918;
Query OK, 0 rows affected (17.10 sec)
#这样B库和C库在B库停止那个时间点,数据是一致的。
#4.在C库上重新变更主库
#io线程还在工作,sql线程已经停止,所有都停止下复制进程。
mysql> stop slave;
#之后停止复制,之后
mysql> reset slave
#5.change到B库上,因为b库在停止时候查看了2个进度一个是对于A库的复制进度,还有一个是本身的master状态,这个时候正好给C库用上,
#之后就可以正常进行级联复制了。
CHANGE MASTER TO
MASTER_HOST='10.204.11.203', #B库的ip
MASTER_USER='repl',
MASTER_PASSWORD='******',
MASTER_PORT=3994,
MASTER_LOG_FILE='mysql-bin.000005', #b库上显示的show master status文件号
MASTER_LOG_POS=154; #b库上显示的show master status pos号。
#对比语句
#C库
[root@d11092377 ~]# goto3991 -e"show slave status\G" 2>/dev/null|grep "Master_Log_"
Master_Log_File: mysql-bin.000003 #寻找的C库现在进度
Read_Master_Log_Pos: 154
Relay_Master_Log_File: mysql-bin.000003
Exec_Master_Log_Pos: 154 #C库现在进度
#b库
[root@d16090074 mysql]# goto3991 -e"show slave status\G" 2>/dev/null|grep "Master_Log_"
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 154
Relay_Master_Log_File: mysql-bin.000003
Exec_Master_Log_Pos: 154
这这个时候,两个库的复制进度一样,也就是进度一致,省的执行C库追赶操作。
直接查看B库现在的master status。
[root@d16090074 mysql]# goto3991 -e"show master status;" 2>/dev/null
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
在C库直接reset slave;之后change 到b库就可以了。
级联复制变成一主两从
#1.在B库上执行
goto3994 -e" stop slave SQL_THREAD;"
Query OK, 0 rows affected (0.01 sec)
goto3994 -e"show slave status\G" 2>/dev/null|grep "Master_Log_" #获取停止应用SQL时候A库的复制进度。
goto3994 -e"show slave status\G" 2>/dev/null |grep "_Running:" #确认复制进程关闭了SQL进程。
#2.在C库上执行
goto3994 -e"show slave status\G" 2>/dev/null |grep "_Running:"
goto3994 -e"show slave status\G" 2>/dev/null|grep "Master_Log_"
[root@d11092377 ~]# goto3994 -e"show slave status\G" 2>/dev/null|grep "Master_Log_"
Master_Log_File: mysql-bin.000005 #获取进度
Read_Master_Log_Pos: 980
Relay_Master_Log_File: mysql-bin.000005
Exec_Master_Log_Pos: 980 #获取pos号
#3.查看B库和C库的复制进度一样的时候,进行change修改。
#4.在B库上执行再次确认复制进度
goto3994 -e"show slave status\G" 2>/dev/null|grep "Master_Log_" #获取停止应用SQL时候A库的复制进度。
goto3994 -e"show slave status\G" 2>/dev/null |grep "_Running:" #确认复制进程关闭了SQL进程。
#5.开始进程切换
#在C库上执行
goto3994 -e"show master status;" 2>/dev/null #确认复制进度赶上B库的进度。因为此时B库是静止的,所以应该很好追赶。
goto3994 -e"stop slave;"
goto3994 -e"reset slave;"
goto3994
mysql>
CHANGE MASTER TO
MASTER_HOST='10.204.11.203', #A库的ip
MASTER_USER='repl',
MASTER_PASSWORD='******',
MASTER_PORT=3994,
MASTER_LOG_FILE='mysql-bin.000005', #b库上显示的A库的复制进度 文件号
MASTER_LOG_POS=154; #b库上显示的A库的复制进度 pos号
start slave;
select sleep(1);
show slave status\G #进行检查完成。