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 #进行检查完成。