---
title: 异常切换
description: "1. 主从复制已建立。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengmysqlmasterslave_03_0045.html
sourcePath: /source/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengmysqlmasterslave_03_0045.html
indexId: b61bda75b50babe8db3565f11ea31bce02bfcafae85b18972b0de78bd83421fe80
---
# 异常切换

1. 主从复制已建立。
2. 客户端应用正常操作（客户端对主库进行操作）。
3. 模拟主库异常（3种情况，选择1种执行）。

  - 主库宕机。
    OS执行关机操作。

    1 shutdown -h now

    或者强制关闭数据库进程。

    1 2 kill -p 'pidof mysqld' ps -ef | grep mysql

  - 主库断网。
    OS执行网卡down操作，例如：

    1 ifdown enp5s0

  - 主库磁盘（即数据盘）故障。
    主库删除所有的数据文件。

    1 2 3 ls /data/mysql/data/ibdata* rm –rf /data/mysql/data/ibdata* ls /data/mysql/data/ibdata*

4. 查看从库状态。
```
show slave status\G;
```

确认从库不再接收主库的binlog信息后，停止客户端应用（为了保证业务数据的完整性，停止客户端对主库的操作）。
如果有下面3种情况中的1种，则说明从库不再接收主库的binlog信息。

  - Slave_IO_Running为No。
  - Last_IO_Error有报错信息。
  - Retrieved_Gtid_Set（或Read_Master_Log_Pos）保持不变。
5. 确认所有从库同步完成，参考2。
6. 选举新主库。

  a. 登录从库。
    1 /usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/run/mysql.sock

  b. 查看所有从库的状态。
    1 show slave status\G;

    比较Exec_Master_Log_Pos值（传统方式）或者Executed_Gtid_Set值（GTID方式），值最大的从库选举为新主库（如果值相等则选择其中1个作为新主库）。

  c. 选举的从库，执行下面命令手动升级为新主库（MySQL数据库自身不提供自动切换，自动切换可以通过第三方软件实现例如MHA）。
    停止从库，删除从库的所有信息，查看从库状态。

    1 2 3 stop slave; reset slave all; show slave status \G;

    查看主库状态，记录File参数值（binlog日志文件）和Position参数值（binlog中最新操作的位置），7.e会用到这2个参数值。

    1 show master status;

    通过查看主从复制确认从库的配置（部署方式、同步方式和是否开启并行），然后参考部署MySQL主从复制中对应的“配置主库”章节配置新主库。

    如果主库想重置File（binlog日志文件）和Position（binlog中最新操作的位置），则执行： 1 2 reset master; show master status;

  d. 确认新主库的log_bin值为ON。
    1 show variables like 'log_bin';

    若log_bin值为OFF，执行下面的操作： 打开配置文件。 1 vim /etc/my.cnf 按“i”进入编辑模式，修改以下内容。 [mysqld] log-bin=mysql-bin 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。 重启MySQL服务，如果成功则没问题。 1 service mysql restart 或者 1 2 /usr/local/mysql/bin/mysqladmin -uroot -p123456 shutdown -S /data/mysql/run/mysql.sock /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &

7. 其它从库指向新主库。

  a. 登录从库。
    1 /usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/run/mysql.sock

  b. 确认从库上的relay log回放状态。
    1 show slave status \G;

    Slave_SQL_Running_State显示："Slave has read all relay log;waiting for more updates"，回放成功。

  c. 停止从库。
    1 stop slave;

    删除从库的所有信息，查看从库状态。

    1 2 reset slave all; show slave status \G;

  d. 配置同步方式，参考    4
。
  e. 从库指向新主库（根据4的同步方式选择）。

    - 传统方式（master_log_file和master_log_pos是      6.c
前面新主库查询到的，根据实际情况修改）：
      1 change master to master_host='192.168.220.72',master_port=3306,master_user='replicate',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=155;


    - GTID方式：
      1 change master to master_host='192.168.220.72',master_port=3306,master_user='replicate',master_password='123456',master_auto_position=1;

  f. 启动从库。
    1 start slave;

  g. 查看从库状态。
    1 show slave status \G;

    下面两项值均为Yes，即表示设置从库成功。

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

8. 确认所有从库同步完成，参考2。校验主从数据一致性（参考校验一致性）。
9. 恢复旧主库，旧主库指向新主库。

  a. 主库宕机恢复。
    OS开机并启动数据库进程。

    1 2 ps -ef | grep mysql /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &

  b. 主库断网恢复。
    1 2 3 ip a ifup enp5s0 ip a

  c. 主库磁盘故障恢复。
    如果是磁盘损坏，导致的主库不可用，建议使用物理备份（例如XtraBackup）或者逻辑备份（mysqldump）对数据进行恢复。

    通过查看主从复制确认从库的配置（部署方式、同步方式和是否开启并行复制），然后参考部署MySQL主从复制中对应的“配置从库”章节配置旧主库。

10. 确认旧主库作为从库加入后同步完成（参考2）。
11. 获取主库状态值，参考3。
12. 获取从库状态值，参考4。
13. 对比前面获取的主库状态值和从库状态值，确认从库是否完成所有relay log的回放，参考5。
