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 锁;