MySQL中主从不一致如何解决

  

MySQL中主从不一致如何解决,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强>一、MySQL主从不同步情况 <强>

<强> 1.1网络的延迟

由于MySQL主从复制是基于binlog的一种异步复制

通过网络传送binlog文件,理所当然网络延迟是主从不同步的绝大多数的原因,特别是跨机房的数据同步出现这种几率非常的大,所以做读写分离,注意从业务层进行前期设计。

<强> 1.2主从两台机器的负载不一致

由于MySQL主从复制是主数据库上面启动1个io线程,而从上面启动1个sql线程和1个io线程,当中任何一台机器的负载很高,忙不过来,导致其中的任何一个线程出现资源不足,都将出现主从不一致的情况。

<强> 1.3 max_allowed_packet设置不一致

主数据库上面设置的max_allowed_packet比从数据库大,当一个大的sql语句,能在主数据库上面执行完毕,从数据库上面设置过小,无法执行,导致的主从不一致。

<强> 1.4自增键不一致

键自增键开始的键值跟自增步长设置不一致引起的主从不一致。

<强> 1.5同步参数设置问题

MySQL异常宕机情况下,如果未设置sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出现binlog或者relaylog文件出现损坏,导致主从不一致。

<强> 1.6自身虫

MySQL本身的错误引起的主从不同步

<强> 1.7版本不一致

特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数据库上面不支持该功能。

<强> 1.8主从不一致优化配置

基于以上情况,先保证max_allowed_packet,自增键开始点和增长点设置一致
再者牺牲部分性能在主上面开启sync_binlog,对于采用innodb的库,推荐配置下面的内容

innodb_flush_logs_at_trx_commit =1   innodb-support_xa =, 1, #, Mysql  5.0,以上   innodb_safe_binlog ,, #, Mysql  4.0

同时在从上面推荐加入下面两个参数

skip_slave_start   read_only

<强>二,解决主从不同步的方法 <强>

<强> 2.1主从不同步场景描述

今天发现Mysql的主从数据库没有同步

先上主库:

mysql> show  processlist;

查看下进程是否睡眠太多。发现很正常。

show  master 地位;

查看主库状态也正常。

mysql>, show  master 地位;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   |,File ,,,,,, |, Position  |, Binlog_Do_DB  |, Binlog_Ignore_DB ,,,,, |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | |,mysqld-bin.000001 ,, 3260, |,,,,,,, |, mysql,测试,information_schema  |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   1,row  set 拷贝;(0.00,sec)

再到奴隶上查看

mysql>, show  slave 状态\ G ,,,,,,,,,,,,,,,,,,,,,,,,      Slave_IO_Running:是的   Slave_SQL_Running:,没有

由此可见是奴隶不同步

<强> 2.2解决方法一:忽略错误后,继续同步

该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况
解决:

stop 奴隶;

表示跳过一步错误,后面的数字可变

set  global  sql_slave_skip_counter =1;   start 奴隶;

之后再用mysql>显示奴隶状态\ G查看:

Slave_IO_Running:是的   Slave_SQL_Running:是的,

好的,现在主从同步状态正常了…

<强> 2.3方式二:重新做主从,完全同步

该方法适用于主从库数据相差较大,或者要求数据完全统一的情况

解决步骤如下:

1。先进入主库,进行锁表,防止数据写入

使用命令:

mysql>, flush  tables  with  read 锁;

MySQL中主从不一致如何解决