Mysql主从节点不同步解决方法

原因

主从数据库不同步一般是因为在主节点上做的一个操作在从节点上执行失败。
例如有一个表中有一个自增的主键primary_key, 在主从集群处于同步状态时,最大的primary_key是1000,现在在从节点上对这个表做一个插入操作A,那么从节点上最新的primary_key是1001,然后在主节点上做一个插入操作,那么主节点上的最新primary_key是1001。同步时,主节点上的操作会被复制到从节点上,但是从节点上已经有1001,那么插入操作失败了,从节点就没法继续和主节点保持一致了。
其他一些可能的操作:alter table table1…., 但是从节点上没有table1,那么这个操作无法同步到从节点上

如何判断数据库不同步

如果只有一个从节点,那么现象就是在主节点上做的写操作没有办法读出来,如果是多个从节点,那么当有某个节点不同步时,会出现客户端一会儿拿到的数据是正确的,一会是错误的(这个的前提是客户端是从从节点做读操作,并且开了负载均衡;如果是从主节点读,那么客户端是感觉不到的)。也可以按照以下步骤:
* 登录节点

    mysql -u -p

* 查看从节点同步信息

    show slave status\G;

如果Slave_SQL_Running_State不是Slave has read all relay log; waiting for the slave I/O thread to update it, 而是一条错误信息,那么这个时候数据库是不同步的

解决方法

  1. 停掉不同步的节点,确保客户端获取数据的正常

如果没有将mysql配置成service,那么从mysql所在节点停止服务器的命令是:

mysqladmin -u -p shutdown

user需要比较高的权限,比较简单的方法是直接root,保准能成

如果mysql配置成服务了,那么停止的命令是:

sudo service mysql stop
  1. 如果该节点提供了读服务,那么应该从你的业务代码中mysql配置中先删除该节点的地址,从先发布代码,不再从坏掉的节点读数据,这样可以最快的恢复服务。
  2. fix it

    • 重启该节点

          sudo mysqld_safe &
      

      或者

          sudo service mysql.server start
      
    • 登录该节点

      mysql -u -p
      

      最好用root登录

    • 查看当前slave同步状态

      show slave status\G;
      

      这个时候你肯定能看到一行是Exec_Master_Log_Pos : 注意不是Read_Master_Log_Pos
      Exec_Master_Log_Pos后面的那个数字记下来,有用。
      还有另外一行Relay_Master_Log_File:

    • 手动修改冲突的操作 首先,我们要知道引起从节点不能同步的原因是什么,在mysql中执行show slave status\G;在输出中看Slave_SQL_Running_State, Last_Errno, Last_Error, Last_IO_Errno, Last_IO_Error, Last_SQL_Errno, Last_SQL_Error这几个值,一般就能明白是什么操作导致了节点不同步,然后手动修正(比如如果是主键冲突导致的不同步,那么删除冲突主键的那条记录就可以了)

    • 停止slave同步线程

      stop slave;
      
    • 修改同步的master的信息

      change master to master_host = ,
                       master_port = ,
                       master_user = ,
                       master_password = ,
                       master_log_file = ,
                       master_log_pos = ;
      

      就是刚才上面看到的Relay_Master_Log_File, 就是上面看到的Exec_Master_Log_Pos

    • 启动slave同步线程

      start slave;
      
    • 查看slave线程状态

      show slave status\G;
      

      注意看两行Slave_IO_RunningSlave_SQL_Running,如果为两个 Yes, 恭喜你,你修好了。如果不是两个Yes,那么有可能是3. fix it这一步你出问题了,可以重新做一遍。是的,是可以重新做一遍的,不会搞坏,反正已经坏了。如果确定步骤无误,那么可能需要其他方法解决,欢迎讨论

      为什么要这么做可以参考另一篇博客Mysql主从复制原理

你可能感兴趣的:(database,集群)