详解mysql主从切换--实战

来源:互联网 发布:lamp linux版本 编辑:程序博客网 时间:2024/06/14 05:14

主服务器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中间件的知识,这边就不作详细介绍了,大家可以自己去网上找下相关内容.

0 0
原创粉丝点击