MySQL 5.6主从报错的实战记录
1.问题现象
版本:MySQL5.6,采用传统binlogfile&pos方式配置的主从复制结构。
实例重启后,主从复制报错如上图所示。
2.错误含义
错误分为2部分。
第一部分
- Clientrequestedmastertostartreplicationfromposition>filesize;
- thefirstevent'mysql-bin.000398'at163800795,thelasteventreadfrom'./mysql-binlog.000398'at4,thelastbytereadfrom'./mysql-bin.000398'at4'
第一部分
这部分来源于主库的DUMP线程函数
mysql_binlog_send ->sender.run() ->Binlog_sender::init ->Binlog_sender::check_start_file if((file=open_binlog_file(&cache,m_linfo.log_file_name,&errmsg))<0) { set_fatal_error(errmsg); return1; } size=my_b_filelength(&cache); end_io_cache(&cache); mysql_file_close(file,MYF(MY_WME)); if(m_start_pos>size) { set_fatal_error("Clientrequestedmastertostartreplicationfrom" "position>filesize"); return1; }
关键就是m_start_pos和size两个值,其中m_start_pos来源于从库需要读取的位点。而size则是本binlog文件的大小,那么很容易理解如果io线程需要的pos点比本binlog文件的大小还要大,那么自然不对。
第二部分
这部分也来源于DUMP线程
mysql_binlog_send ->sender.run() ->Binlog_sender::init ->while(!has_error()&&!m_thd->killed) #如果正常这里开始循环读取binlogevent,如果前面出错则直接继续后面逻辑 #如果有读取错误则报错 my_snprintf(error_text,sizeof(error_text), "%s;thefirstevent'%s'at%lld," "thelasteventreadfrom'%s'at%lld," "thelastbytereadfrom'%s'at%lld.", m_errmsg, m_start_file,m_start_pos,m_last_file,m_last_pos, log_file,my_b_tell(&log_cache));
这里我们主要看看m_start_pos和m_last_pos,实际上m_start_pos就是和前面报错一致的来自从库需要读取的位点信息,而m_last_pos来自dump线程,就是最后读取的位置,显然这里一次都没有读取,因此位置为最开始的pos4。
3.可能的原因
分析后觉得最有可能原因应该和sync_binlog有关。
如果我们没有设置为1,那么可能oscache没有刷盘,如果主库服务器直接crash重启很容易就遇到这种问题。
稍微google查询了一下发现很大部分出现这种错误都是由于服务器crash且sync_binlog没设置为1导致的。
这也证明我们的说法。
最后查看问题数据库的主库确实没有设置为双1。
那么通过这个小案例,我们已经更加深刻体会到设置双1的重要性。
总结
到此这篇关于MySQL5.6主从报错的文章就介绍到这了,更多相关MySQL5.6主从报错内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。