主服务器mysql1 ,对应端口3306
从服务器mysql2和mysql3 ,分别对应端口3307和3308
从服务器的--log-slave-updates是关闭的show variables;确认是关闭的,原因是为了防止从服务器可能会收到2次更新。
假定slave 1--log-slave-updates 是开着的,它将把更新写到自己的二进制日志中。
当slave2换主服务器为slave1的时候,就可能收到已经接收过master的更新
mysql1> select * from t;
+------+-------+
| i |name |
+------+-------+
| 2 | name2|
| 1 | name1|
+------+-------+
2 rows in set (0.00 sec)
现在模拟主服务器挂了/etc/rc.d/init.d/mysql1stop
在每个从服务器上执行stop slave io_thread;
然后show processlist;确保State: Has read allrelay log;
mysql2设为新的主服务器。在这台服务器上执行:
mysql2> stop slave;
mysql2> reset master; reset master清空了master的binlog以后创建了新的binlog
从服务器mysql3重设主服务器。
mysql3> stop slave;
mysql3> CHANGE MASTER TO
MASTER_HOST='localhost',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3308;
这里不需要设定日志的位置,因为主服务器清空了日志创建新的binlog
最后mysql3启动slave:
mysql3> start slave;
测试下重新设置的主从(这时mysql2为主,mysql3为从)是否成功:
mysql2> insert into t values(3,'name3');
Query OK, 1 row affected (0.00 sec)
mysql3> select * from t;
+------+-------+
| i |name |
+------+-------+
| 3 | name3|
| 2 | name2|
| 1 | name1|
+------+-------+
3 rows in set (0.00 sec)
当mysql1恢复的时候,可以让mysql1成为mysql2的从服务器,这样可以得到mysql1挂了以后的mysql2更新
/etc/rc.d/init.d/mysql1 start
mysql1>CHANGE MASTER TO
MASTER_HOST='localhost',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3308;
mysql1> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql1> select * from t;
+------+-------+
| i |name |
+------+-------+
| 3 | name3|
| 2 | name2|
| 1 | name1|
+------+-------+
3 rows in set (0.00 sec)
现在mysql2是主服务器mysql1,mysql3是从服务器。
假如想设回mysql1为主服务器。
这个时候应该把mysql2的服务器设为不能更新,因为他要变回从服务器。
stop slave io_thread;
确保所有服务器Hasread all relay log;
在mysql1上执行:
mysql1> stop slave;
mysql1> reset master;
mysql2,mysql3执行
stop slave;
CHANGE MASTER TO
MASTER_HOST='localhost',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307;
最后启动slave:start slave;
show processlist;
mysql1> insert into t values(4,'name4');
Query OK, 1 row affected (0.00 sec)
在mysql2和mysql3上分别查看:
mysql2或3> select * from t;
+------+-------+
| i |name |
+------+-------+
| 4 | name4|
| 3 | name3|
| 2 | name2|
| 1 | name1|
+------+-------+
4 rows in set (0.00 sec)
可以了
总结:切换主从服务器的条件:从服务器的--log-slave-updates关闭,log-bin 开着
注意的问题:stop slave io_thread;确保Has read allrelay log;
从服务器change master 之前主服务器reset master;
如果有安装amoeba中间件,主从切换会有稍许差别,操作起来也会更复杂一些,比如需要修改amoeba配置文件的数据池信息等...因为涉及到amoeba中间件的知识,这边就不作详细介绍了,大家可以自己去网上找下相关内容.