mysql主从架构下,如果发生主库故障,需要进行主从切换,主从切换的主要步骤如下:
echo “查看主库状态….”mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”SHOW MASTER STATUS\G”;
mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”SHOW PROCESSLIST\G”;
echo “锁表….”mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”FLUSH TABLES WITH READ LOCK\G”;
mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”SHOW PROCESSLIST\G”;
echo “解锁….”mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”UNLOCK TABLES\G”;
echo “对原从库进行操作,停止主从复制,并提升为master”
mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”SHOW REPLICA STATUS\G”;
mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”STOP REPLICA IO_THREAD\G”;
mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”SHOW PROCESSLIST\G”;
是否需要进行数据导入,根据实际情况决定,如果主从复制的用户repl不存在,需要进行创建并授权
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”;
mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”SET GLOBAL READ_ONLY=OFF\G”;
mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT –silent –execute=”SHOW MASTER STATUS\G”;
mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”SET GLOBAL READ_ONLY=ON\G”;
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”;
mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT –silent –execute=”START REPLICA USER=’repl’ PASSWORD=’repl’\G”;
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";