MySQL主从复制主从之间数据不一致的原因和解决

面试被问到主从复制的主和从之间的数据不一致的原因,以及解决方法,当时没答出来,一是确实没有思考过这个问题,二来也有些因为紧张,没有想到。后来再次回想自己所学习的主复制的过程,应该有这几个原因:

  • 主从之间存在防火墙或selinux阻拦,从服务器没法到主服务器上拿到数据;
  • 在搭建主从复制架构的时候没有进行一次数据同步
  • 网络的延迟
  • 数据量太大

解决的方法:

  • 关闭防火墙和selinux

    service firewalld stop
    systemctl disable firewalld.service
    setenforce 0
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
    
  • 再进行一次数据同步

    # 进入主库,进行锁表,防止数据写入
    mysql> flush tables with read lock;
    
    # 备份主服务器上的数据
    mysqldump -uroot -p --all-databases > backup.sql
    # scp backup.sql root@xxx.xxx.xxx.xxx:~
    
    #在从服务器上导入数据
    mysql -uroot -p < /root/backup.sql 
    
  • 网络的问题。。。

  • 数据量太大,可以配置负载均衡,如配置读写分离。

查了一下资料,主从复制不一致的原因还有可能是以下的原因:

  1. 从库写入

  2. 主从复制过程中主库异常宕机

  3. 主库的max_allowed_packet参数比从库大,一个较大的SQL语句在从库上无法执行

  4. 主数据库版本高于从数据库

    解决方案:低版本做主库,高版本做从库