加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL主从不同步问题分析与解决思路

发布时间:2022-04-05 14:23:47 所属栏目:MySql教程 来源:互联网
导读:之前部署了Mysql主从复制环境(MySQL主从复制环境部署【http://blog.itpub.net/31015730/viewspace-2153251/】)以及总结了mysql主从复制的原理和相关知识(MySQL主从复制原理及必备知识总结【http://blog.itpub.net/31015730/viewspace-2154408/】),但是
         之前部署了Mysql主从复制环境(MySQL主从复制环境部署【http://blog.itpub.net/31015730/viewspace-2153251/】)以及总结了mysql主从复制的原理和相关知识(MySQL主从复制原理及必备知识总结【http://blog.itpub.net/31015730/viewspace-2154408/】),但是在mysql主从同步过程中会出现很多问题,导致数据同步异常,主要有两个比较头疼的问题:
 
      1、主从数据不同步后如何处理?
 
      2、主从同步延迟问题如何解决?
 
      slave同步延迟的可能原因
 
     1--slave的I/O线程推迟读取日志中的事件信息;最常见原因是slave是在单线程中执行所有事务,而master有很多线程可以并行执行事务。
 
     2--带来低效连接的长查询、磁盘读取的I/O限制、锁竞争和innodb线程同步启动等。
 
     3--Master负载;Slave负载
 
     4--网络延迟
 
     5--机器配置(cpu、内存、硬盘)
 
(主从同步延迟怎么产生的?)总之,当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能处理的承受范围时,主从同步就会产生延时;或者当slave中有大型query语句产生了锁等待也会产生延时。
 
如何查看同步延迟
 
1--可以通过比对master、slave上的日志位置
 
2--通过"show slave statusG"查看Seconds_Behind_Master的值,这个值代表主从同步延迟的时间,值越大说明延迟越严重。值为0为正常情况,正值表示已经出现延迟,数字越大从库落后主库越多。
 
3--使用percona-toolkit的pt-hearbeat工具进行查看。
 
减少同步延迟的操作方案
 
1--减少锁竞争
 
    如果查询导致大量的表锁定,需要考虑重构查询语句,尽量避免过多的锁。
 
2--负载均衡
 
    搭建多少slave,并且使用lvs或nginx进行查询负载均衡,可以减少每个slave执行查询的次数和时间,从而将更多的时间用于去处理主从同步。
 
3--salve较高的机器配置
 
4--slave调整参数
 
    为了保障较高的数据安全性,配置sync_binlog=1,innodb_flush_log_at_trx_commit=1等设置。而Slave可以关闭binlog,innodb_flush_log_at_trx_commit也可以设置为0来提高sql的执行效率(这两个参数很管用)
 
5--并行复制
 
    即将单线程的复制改成多线程复制。
 
    从库有两个线程与复制相关:io_thread 负责从主库拿binlog并写到relaylog, sql_thread 负责读relaylog并执行。
 
多线程的思路就是把sql_thread 变成分发线程,然后由一组worker_thread来负责执行。
 
几乎所有的并行复制都是这个思路,有不同的,便是sql_thread 的分发策略。
 
MySQL5.7的真正并行复制enhanced multi-threaded slave(MTS)很好的解决了主从同步复制的延迟问题。
 
(2)slave同步状态中出现Slave_IO_Running: NO
 
报错:Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
 
原因1:清理数据导致主从库不同步(前提是主库的binlog日志没有被暴力删除或错误删除,即要确保正在使用的那个最新binlog文件在master主库机器上存在)。
 
解决办法:
 
1)先进入slave中执行:"slave stop;"来停止从库同步;
 
2)再去master中执行:"flush logs;"来清空日志;
 
3)然后在master中执行:"show master status;"查看下主库的状态,主要是日志的文件和position;
 
4)然后回到slave中,执行:"CHANGE MASTER TO ......执行同步指令
 
原因2:该错误发生在从库的io进程从主库拉取日志时,发现主库的mysql_bin.index文件中第一个文件不存在。出现此类报错可能是由于你的slave 由于某种原因停止了好长一段时间,当你重启slave 复制的时候,在主库上找不到相应的binlog ,会报此类错误。或者是由于某些设置主库上的binlog被删除了,导致从库获取不到对应的binglog file。

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!