MySQL主从不同步问题分析与解决思路
发布时间:2022-04-05 10:33:02 所属栏目: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。 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读