MySQL 5.6 主从报错一例

简介: MySQL 5.6 主从报错一例

1. 问题现象

版本:MySQL 5.6,采用传统 binlog file & pos 方式配置的主从复制结构。

屏幕快照 2021-11-19 上午12.32.31.png

实例重启后,主从复制报错如上图所示。

2. 错误含义

错误分为2部分。

第一部分

  • Client requested master to start replication from position > file size;
  • the first event 'mysql-bin.000398' at 163800795,the last event read from './mysql-binlog.000398' at 4,the last byte read from './mysql-bin.000398' at 4'

第一部分

这部分来源于主库的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);
    return 1;
  }

  size= my_b_filelength(&cache);
  end_io_cache(&cache);
  mysql_file_close(file, MYF(MY_WME)); 

  if (m_start_pos > size)
  {
    set_fatal_error("Client requested master to start replication from "
                    "position > file size");
    return 1;
  }

关键就是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)
#如果正常这里开始循环读取binlog event,如果前面出错则直接继续后面逻辑
#如果有读取错误则报错
my_snprintf(error_text, sizeof(error_text),
"%s; the first event '%s' at %lld, "
"the last event read from '%s' at %lld, "
"the last byte read from '%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线程,就是最后读取的位置,显然这里一次都没有读取,因此位置为最开始的pos 4。

3. 可能的原因

分析后觉得最有可能原因应该和sync_binlog 有关。

如果我们没有设置为1,那么可能os cache没有刷盘,如果主库服务器直接crash重启很容易就遇到这种问题。

稍微google查询了一下发现很大部分出现这种错误都是由于服务器crash且sync_binlog 没设置为 1导致的。

这也证明我们的说法。

最后查看问题数据库的主库确实没有设置为双1。

那么通过这个小案例,我们已经更加深刻体会到设置双1的重要性。

全文完。

Enjoy MySQL :)

            </div>
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
数据库
jumpserver V2自动同步、更新阿里云资产
jumpserver V2自动同步、更新阿里云资产
耳返耳机有哪些品牌?
【7月更文挑战第11天】耳返耳机有哪些品牌?
1420 2
|
设计模式 XML Java
Spring的生命周期及Spring Bean单例和多例---超详细教学
Spring的生命周期及Spring Bean单例和多例---超详细教学
1288 0
|
弹性计算 安全 网络安全
转发路由器 Transit Router(TR):实现企业级互联网络的灵活与可靠
转发路由器 Transit Router(简称“TR”)是地域范围内企业级核心转发网元,可为用户转发同地域或不同地域的网络实例间的流量,并支持在地域内定义灵活的互通、隔离、引流策略,帮助用户打造一张灵活、可靠、大规模的企业级互联网络。通过搭配云数据传输(简称“CDT”),用户可实现跨地域连接场景数据传输按流量计费的能力。
|
安全 Java 大数据
Java并发编程实战指南
在Java开发中,随着多核处理器的普及,并发编程已经成为提升应用程序性能的重要手段。本文将深入探讨Java并发编程的核心概念和技术,包括线程、锁、原子变量以及并发工具类等,并通过实际案例展示如何在Java中有效地实现并发控制和同步管理。
434 0
|
NoSQL 关系型数据库 MySQL
HAProxy的高级配置选项-haproxy的四层负载及访问控制案例
这篇文章介绍了HAProxy的高级配置选项,特别是如何进行四层负载均衡和基于策略的访问控制。通过实战案例,展示了如何配置HAProxy以实现对特定IP地址的访问控制,以及如何通过四层负载均衡将流量分配到后端的MySQL和Redis服务。
488 6
|
存储 算法 程序员
408计算机组成原理学习笔记——存储系统(三)
408计算机组成原理学习笔记——存储系统
865 1
408计算机组成原理学习笔记——存储系统(三)
Qt-做一个快速打包插件(一键完成项目软件打包)
Qt-做一个快速打包插件(一键完成项目软件打包)
366 0
|
关系型数据库 MySQL Java
【MySQL用法】MySQL中大于,大于等于,小于,小于等于的转义写法
【MySQL用法】MySQL中大于,大于等于,小于,小于等于的转义写法
2601 0