diff --git a/MySQL自动切换主从/switch_master_slave.sh b/MySQL自动切换主从/switch_master_slave.sh index 4bd26be..dbd1f9f 100644 --- a/MySQL自动切换主从/switch_master_slave.sh +++ b/MySQL自动切换主从/switch_master_slave.sh @@ -10,12 +10,21 @@ MYSQL_PORT=3306 # MySQL端口 MYSQL_REPL_USER="repl" MYSQL_REPL_PASSWD="Unary@2023" -# TODO(MH:)获取当前主从关系 -get_current_roles() { - if [ -f "$IDENTIFIER_FILE" ]; then - CURRENT_ROLE=$(cat "$IDENTIFIER_FILE") +# 获取当前主从关系 +pre_check() { + MASTER_STATUS=$(mysql -h$MASTER_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -P$MYSQL_PORT -e "show slave status\\G;"|grep -E "Slave_IO_Running: Yes|Slave_SQL_Running: Yes|Seconds_Behind_Master: 0"|wc -l) + SLAVE_STATUS=$(mysql -h$SLAVE_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -P$MYSQL_PORT -e "show slave status\\G;"|grep -E "Slave_IO_Running: Yes|Slave_SQL_Running: Yes|Seconds_Behind_Master: 0"|wc -l) + if [ "$MASTER_STATUS" -eq 0 ] && [ "$SLAVE_STATUS" -eq 3 ]; then + echo "$MASTER_HOST 是主节点,即将切换为 $SLAVE_HOST" + elif [ "$MASTER_STATUS" -eq 3 ] && [ "$SLAVE_STATUS" -eq 0 ]; then + echo "$SLAVE_HOST 是主节点,即将切换为 $MASTER_HOST" + # 交换主从 + new_master=$MASTER_HOST + MASTER_HOST=$SLAVE_HOST + SLAVE_HOST=$new_master else - CURRENT_ROLE="unknown" + echo "当前不是主从集群,请确认后主从状态是否正常" + exit 1 fi } @@ -69,17 +78,19 @@ check_replication_status() { REPLICATION_STATUS=$(mysql -h$MASTER_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -P$MYSQL_PORT -e "show slave status\\G;"|grep -E "Slave_IO_Running: Yes|Slave_SQL_Running: Yes|Seconds_Behind_Master: 0"|wc -l) # 判断是否修改成功了 - if [ "$off_number" != "3" ]; then + if [ "$REPLICATION_STATUS" != "3" ]; then echo "主从切换异常,请人工确认!!" exit 1 fi - echo "主从切换成功!" + echo "主从切换成功!当前 $SLAVE_HOST 是主节点" } # 主函数 main() { - #get_current_roles + # 预检测 + pre_check # 将主节点设置为只读 + echo $MASTER_HOST set_master_redonly # 停止从节点,并关闭只读 set_slaver_status