环境设定
假设有3台MySQL服务器,分别为Master,Standby,Slave.
其实Standby也是一个Slave,只是叫法不一样而已.
切换Master原理
切换Master的一个基本思路就是:Slave和Standby在完全相同的位置停止运行,然后把Slave重定向到Standby.
模拟真实场景
场景准备
当数据量大时,Standby和Slave的数据可能不一样
(如其中一个快的把Master的完全同步好,另外一个同步进度稍微落后)
即Slave和Standby不在完全相同的位置停止运行.
现假定Slave稍微落后,连上Slave,执行
stop slave;
show slave status\G确认slave已经停掉
Slave_IO_Running: No
Slave_SQL_Running: No在Master上执行一些sql操作
Master >insert into init.test (id) values(1),(2),(3);分别在Standby和Slave查看是否有数据改变
结果如下
Slave > select * from init.test;
Empty set (0.02 sec)Standby > select * from init.test;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)此时,Standby和Slave的同步进度就不一样.
Standby > show slave status\G
...
Relay_Master_Log_File: master-bin.000001
...
Exec_Master_Log_Pos: 454
...Slave > show slave status\G
...
Relay_Master_Log_File: master-bin.000001
...
Exec_Master_Log_Pos: 210
...Standby执行到454,Slave执行到210,Standby超前于Slave.
切换Master
停掉Standby的slave
Standby > stop slave;使Standby和Slave停在完全相同的位置上.根据前面的场景准备得到它们的位置.
然后执行
Slave > start slave until
-> master_log_file = 'master-bin.000001',
-> master_log_pos = 454;
Slave > select master_pos_wait('master-bin.000001',454);
Slave > stop slave;此时再查看Slave的slave状态,应该与Standby一样了.
Slave > show slave status\G
...
Relay_Master_Log_File: master-bin.000001
...
Exec_Master_Log_Pos: 454
...现在把Standby切换成新的主服务器.
把Slave连接到Standby并重启slave.
因为Master在停止运行点记录的文件和位置与Standby在同一点记录的文件和位置是完全不同的,有必要获取当Master记录更改时Standby记录的位置.
为此,在Standby上运行
Standby > show master status\G
*************************** 1. row ***************************
File: master-bin.000006
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)获得位置信息后
在Slave上执行
Slave > CHANGE MASTER TO
-> MASTER_HOST = '127.0.0.1',
-> MASTER_PORT = 3309,
-> MASTER_USER = 'repl_user',
-> MASTER_PASSWORD = 'root',
-> MASTER_LOG_FILE='master-bin.000006',
-> MASTER_LOG_POS=107;
Query OK, 0 rows affected (0.16 sec)
Slave > start slave;现在Standby就可以作为Master使用了.

还不快抢沙发