---
title: MySQL主从切换
description: "主从切换就是MySQL写节点出现宕机后，会自动切到备用节点。Mycat使用show slave status命令，检查主库和备库之间的心跳，Mycat心跳机制通过检测show slave status中的“Seconds_Behind_Master”、“Slave_IO_Running”、“Slave_SQL_Running”三个字段来确定当前主从同步的状态及Seconds_Behind_Master主从复制时延，当Seconds_Behind_Master > slaveThreshold时，读写分离筛选器会过滤掉此Slave机器，防止读到很久以前的旧数据，当主节点宕机后，切换逻辑会检查Slave上的Seconds_Behind_Master是否为0，为0时则表示主仅同步，可安全切换，否则不会切换。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengmycat_03_0030.html
sourcePath: /source/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengmycat_03_0030.html
indexId: c272990ca1b821878a93dda05f1ee9eec5e0beed3eeaf28f3a9b2a962733a83d69
---
# MySQL主从切换

主从切换就是MySQL写节点出现宕机后，会自动切到备用节点。Mycat使用show slave status命令，检查主库和备库之间的心跳，Mycat心跳机制通过检测show slave status中的“Seconds_Behind_Master”、“Slave_IO_Running”、“Slave_SQL_Running”三个字段来确定当前主从同步的状态及Seconds_Behind_Master主从复制时延，当Seconds_Behind_Master > slaveThreshold时，读写分离筛选器会过滤掉此Slave机器，防止读到很久以前的旧数据，当主节点宕机后，切换逻辑会检查Slave上的Seconds_Behind_Master是否为0，为0时则表示主仅同步，可安全切换，否则不会切换。

1. 配置Mycat schema.xml文件。

  a. 打开文件。
    1 vim /usr/local/mycat/conf/schema.xml

  b. 按“i”进入编辑模式，添加如下内容。
    1 <writeHost host="hosts" url="localhost:3313" user="root" password="123456" />

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
  d. 启动Mycat并查询状态。
    1 2 3 mycat stop mycat start mycat status

    Mycat主从切换通过switchType进行配置，本文采用默认值。 -1表示不自动切换。 1表示默认值，自动切换。 2基于MySQL主从同步的状态决定是否切换。

2. 执行连接测试。

  a. 打开文件。
    1 vim /home/write.sh

  b. 按“i”进入编辑模式，替换为如下内容。
    1 2 3 4 5 #!/bin/bash for i in {20001..22000} do /usr/local/mysql/bin/mysql -uroot -p1234567 -P8066 -h127.0.0.1 --default_auth=mysql_native_password -Dsysbench -e "insert into test1(id,report_hostname) values($i,@@report_host)" done

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
  d. 执行脚本。
    1 sh /home/write.sh

3. 确认测试数据。
  1 /usr/local/mysql/bin/mysql -uroot -p1234567 -P8066 -h127.0.0.1 --default_auth=mysql_native_password -Dsysbench -e "select * from test1"

4. 连接MySQL数据库并关闭主库。
  1 2 /usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/run/mysqlm.sock shutdown;

5. 执行连接测试。

  a. 打开文件。
    1 vim /home/write.sh

  b. 按“i”进入编辑模式，修改插入的记录数从22001到24000。
    1 2 3 4 5 #!/bin/bash for i in {22001..24000} do /usr/local/mysql/bin/mysql -uroot -p1234567 -P8066 -h127.0.0.1 --default_auth=mysql_native_password -Dsysbench -e "insert into test1(id,report_hostname) values($i,@@report_host)" done

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
  d. 执行脚本。
    1 sh /home/write.sh

6. 再次确认数据。
  1 /usr/local/mysql/bin/mysql -uroot -p1234567 -P8066 -h127.0.0.1 --default_auth=mysql_native_password -Dsysbench -e "select * from test1"

  原来的备库切换为主库，所有写操作都路由到新的主库上执行。
