mysql主从切换


mysql主从架构下,如果发生主库故障,需要进行主从切换,主从切换的主要步骤如下:

主库操作

1.查看主库状态

echo “查看主库状态….”mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”SHOW MASTER STATUS\G”;

2.查看处理列表

mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”SHOW PROCESSLIST\G”;

3.锁表

echo “锁表….”mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”FLUSH TABLES WITH READ LOCK\G”;

4.再次查看处理状态

mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”SHOW PROCESSLIST\G”;

4.解锁

echo “解锁….”mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”UNLOCK TABLES\G”;

echo “对原从库进行操作,停止主从复制,并提升为master”

从库操作

1.查看从库复制状态

mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”SHOW REPLICA STATUS\G”;

2.停止从库复制的IO线程

mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”STOP REPLICA IO_THREAD\G”;

3.查看处理状态

mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”SHOW PROCESSLIST\G”;

是否需要进行数据导入,根据实际情况决定,如果主从复制的用户repl不存在,需要进行创建并授权

4.将slave提升为master

mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”STOP REPLICA\G”;mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”RESET MASTER\G”;mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”RESET SLAVE ALL\G”;

5.关闭只读选项

mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”SET GLOBAL READ_ONLY=OFF\G”;

6.查看master状态

mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”SHOW MASTER STATUS\G”;

原主库上操作

1.开启只读状态

mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”SET GLOBAL READ_ONLY=ON\G”;

2.设置复制参数,repl用户已经同步过去了

mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”CHANGE REPLICATION SOURCE TO SOURCE_HOST=’mysql-slave’,SOURCE_PORT=3306,GET_SOURCE_PUBLIC_KEY=1,SOURCE_SSL=1,SOURCE_AUTO_POSITION=1;\G”;

3.启动主从复制

mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”START REPLICA USER=’repl’ PASSWORD=’repl’\G”;

4.检查复制状态

mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”SHOW REPLICA STATUS\G”;

切换脚本

在以上手工操作的基础上,整理了一个脚本,记录了常用的命令。其中缺少了等待主库写操作结束和追平从库数据的步骤,待以后完善。

 #!/bin/sh
 ## switch.sh
 ## 定义变量
 MASTER_HOST=127.0.0.1
 MASTER_PORT=13306
 MASTER_USER=root
 MASTER_PASS=123456
 
 SLAVE_HOST=127.0.0.1
 SLAVE_PORT=23306
 SLAVE_USER=root
 SLAVE_PASS=123456
 
 echo "进行主从切换操作...."
 
 ## 主库操作
 ## 1.查看主库状态
 echo "查看主库状态...."
 mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT --silent --execute="SHOW MASTER STATUS\G";
 ## 2.查看处理列表
 mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT --silent --execute="SHOW PROCESSLIST\G";
 ## 3.锁表
 echo "锁表...."
 mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT --silent --execute="FLUSH TABLES WITH READ LOCK\G";
 ## 4.再次查看处理状态
 mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT --silent --execute="SHOW PROCESSLIST\G";
 ## 4.解锁
 echo "解锁...."
 mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT --silent --execute="UNLOCK TABLES\G";
 
 
 echo "对原从库进行操作,停止主从复制,并提升为master"
 echo "对原从库进行操作,停止主从复制,并提升为master"
 ## 从库操作
 ## 1.查看从库复制状态
 mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT --silent --execute="SHOW REPLICA STATUS\G";
 ## 2.停止从库复制的IO线程
 mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT --silent --execute="STOP REPLICA IO_THREAD\G";
 ## 3.查看处理状态
 mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT --silent --execute="SHOW PROCESSLIST\G";
 
 ## 是否需要进行数据导入,根据实际情况决定,如果主从复制的用户repl不存在,需要进行创建并授权
 ## 4.将slave提升为master
 mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT --silent --execute="STOP REPLICA\G";
 mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT --silent --execute="RESET MASTER\G";
 mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT --silent --execute="RESET SLAVE ALL\G";
 ## 5.关闭只读选项
 mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT --silent --execute="SET GLOBAL READ_ONLY=OFF\G";
 
 ## 6.查看master状态
 mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT --silent --execute="SHOW MASTER STATUS\G";
 
 
 ## 原主库上操作
 ## 1.开启只读状态
 mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT --silent --execute="SET GLOBAL READ_ONLY=ON\G";
 ## 2.设置复制参数,repl用户已经同步过去了
 mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT --silent --execute="CHANGE REPLICATION SOURCE TO SOURCE_HOST='mysql-slave',
 SOURCE_PORT=3306,
 GET_SOURCE_PUBLIC_KEY=1,
 SOURCE_SSL=1,
 SOURCE_AUTO_POSITION=1;\G";
 ## 3.启动主从复制
 mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT --silent --execute="START REPLICA USER='repl' PASSWORD='repl'\G";
 ## 4.检查复制状态
 mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT --silent --execute="SHOW REPLICA STATUS\G";