异常切换

  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. 查看从库状态。

    1
    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. 选举新主库。

    1. 登录从库。
      1
      /usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/run/mysql.sock
      
    2. 查看所有从库的状态。
      1
      show slave status\G;
      

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

    3. 选举的从库,执行下面命令手动升级为新主库(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;
      
    4. 确认新主库的log_bin值为ON。
      1
      show variables like 'log_bin';
      

      若log_bin值为OFF,执行下面的操作:

      1. 打开配置文件。
        1
        vim /etc/my.cnf
        
      2. “i”进入编辑模式,修改以下内容。
        [mysqld]
        log-bin=mysql-bin
      3. “Esc”键,输入:wq!,按“Enter”保存并退出编辑。
      4. 重启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. 其它从库指向新主库。

    1. 登录从库。
      1
      /usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/run/mysql.sock
      
    2. 确认从库上的relay log回放状态。
      1
      show slave status \G;
      

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

    3. 停止从库。
      1
      stop slave;
      

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

      1
      2
      reset slave all;
      show slave status \G;
      
    4. 配置同步方式,参考4
    5. 从库指向新主库(根据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;
        
    6. 启动从库。
      1
      start slave;
      
    7. 查看从库状态。
      1
      show slave status \G;
      

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

      Slave_IO_Running: Yes

      Slave_SQL_Running: Yes

  8. 确认所有从库同步完成,参考2。校验主从数据一致性(参考工具运行)。
  9. 恢复旧主库,旧主库指向新主库。

    1. 主库宕机恢复。

      OS开机并启动数据库进程。

      1
      2
      ps -ef | grep mysql
      /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
      
    2. 主库断网恢复。
      1
      2
      3
      ip a
      ifup enp5s0
      ip a
      
    3. 主库磁盘故障恢复。

      如果是磁盘损坏,导致的主库不可用,建议使用物理备份(例如XtraBackup)或者逻辑备份(mysqldump)对数据进行恢复。

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

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