MySQL:5.6同步到5.7 GTID报错

这篇具有很好参考价值的文章主要介绍了MySQL:5.6同步到5.7 GTID报错。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述和处理

同步到的版本为5.7.35,按理说在5.7种还是一个比较新的版本了,报错大概如下:

2023-05-14T05:09:47.427031Z 12 [Note] Multi-threaded slave statistics for channel '': seconds elapsed = 163; events assigned = 67585; worker queues filled over overrun level = 0; waited due
 a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 0 waited (count) when Workers occupied = 0 waited when Workers occupied = 0
2023-05-14T05:09:48.526341Z 12 [ERROR] Transaction is tagged with inconsistent logical timestamps: sequence_number (7870797233) <= last_committed (2957740090370948108)
2023-05-14T05:09:48.526416Z 12 [ERROR] Slave SQL for channel '': ... The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state. A restart should rest
ore consistency automatically, although using non-transactional storage for data or info tables or DDL queries could lead to problems. In such cases you have to examine your data (see docum
entation for details). Error_code: 1756

从报错来看肯定属于逻辑时钟并发的问题,因为在5.6中gtid event没有last commit和seq number,因此可能并发的时候遇到了问题,因此简单的关闭了MTS并发回放就可以了继续了。

分析原因

实际上在代码中对于GTID不包含的last commit和seq number的情况,在初始化gtid event的时候应该将其初始化为0(SEQ_UNINIT= 0;
),并且并发的时候也会有相关判定如下:

MySQL:5.6同步到5.7 GTID报错

那么这个条件不可能成立,因为last_committed == SEQ_UNINIT,也就不会报错,但是实际上这里报错了。从报错的seq number和last commit值来看,应该是内存越界访问的结果,否则不会有这种很大的seq number和last commit(sequence_number (7870797233) 、 last_committed (2957740090370948108))。

那么接下来就是看看为什么会出现这种情况,也就是gtid event的初始化遇到了什么问题。实际上问题就出在binary_log::Gtid_event::Gtid_event这个构造函数中,如下

MySQL:5.6同步到5.7 GTID报错

这里ptr_buffer + LOGICAL_TIMESTAMP_TYPECODE_LENGTH +
LOGICAL_TIMESTAMP_LENGTH <= buffer + event_len的含义是,如果本次获取的gtid event的长度小于5.7格式的gtid event的长度就不要执行last commit和seq number的赋值,因为5.7的gtid event 包含了16字节的last commit和seq number,还包含了1字节的typecode,总共比5.6的gtid event 大17字节。
但是这里的问题在于buffer + event_len中buffer的位置已经是去掉event header的长度,也就是计算的是event_len的长度+event header的长度,如下,

MySQL:5.6同步到5.7 GTID报错

而event header为19个字节,因此判定的实际上就是是17字节<=19字节,这个条件是一定会满足的,因此这里出现了buffer的越界访问,当越界访问的值也满足第二个条件的时候,就会进行last commit和seq number的赋值,但是为越界访问,因此值不确定,比如看到的如下,

MySQL:5.6同步到5.7 GTID报错

当不确定的值遇到last commit比seq number还大的情况就会报错了。那么这里实际上稍微改一下

MySQL:5.6同步到5.7 GTID报错

就可以了,LOG_EVENT_HEADER_LEN则为19字节。修改编译后5.6到5.7的同步可以正常运行,再次查看last commit和seq number就是0了。

MySQL:5.6同步到5.7 GTID报错


这也是正常的因为5.6就没有last commit和seq number。并且还需要测试5.7到5.7的主从同步,是否gtid event能够拿到正确的值,因为如果这里过滤异常了,则5.7到5.7的同步seq number和last commit 也可能初始化为0,也就是测试修改是否正确,查看seq number和last commit如下,

MySQL:5.6同步到5.7 GTID报错

能够初始化为正常的值。

提问一个问题

C语言内存越界不一定会触发SIGSEGV信号的原因是因为,SIGSEGV是由操作系统抛出的信号,当程序执行访问了无效的内存地址时,操作系统会检测到这种异常情况,并向进程发送SIGSEGV信号。

然而,在C语言中,对于数组和指针的访问并未受到强制的边界检查,如果程序发生内存越界,也许不会直接导致程序崩溃,而是可能引起一些意想不到的结果,比如修改了其他变量的值、出现奇怪的计算结果等。这种情况被称为未定义行为。

因此,当程序存在内存越界的问题时,不一定会立即引发SIGSEGV信号,而是要视具体情况而定,有时候会在操作系统的内存保护机制下触发SIGSEGV信号,有时候则不会。为了避免内存越界带来的未定义行为,应该在编写代码时尽量避免这种情况的出现,或者通过调试工具等手段进行检测和修复。文章来源地址https://www.toymoban.com/news/detail-450710.html

到了这里,关于MySQL:5.6同步到5.7 GTID报错的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • mysql 5.7同步数据到es 7.6.2(集群)

    mysql 5.7同步数据到es 7.6.2(集群)

    小伙伴们,你们好,我是老寇 mysql驱动、canal安装包:https://pan.baidu.com/s/1swrV9ffJnmz4S0mfkuBbIw  提取码:1111 一、前提条件 二、可选方案 三、es api同步数据 四、logstash同步数据到es 五、mysql通过binlog同步数据到es 一、前提条件 安装mycat 1.6,点点我 安装es 7.6.2集群,点点我 安装

    2024年02月02日
    浏览(13)
  • 5.6和5.7、项目整体流程代码实现,解析http请求报文

    代码地址 逻辑单元内部的一种高效编程方法:有限状态机 (finite state machine) 。 有的应用层协议头部包含数据包类型字段,每种类型可以映射为逻辑单元的一种执行状态,服务器可以根据它来编写相应的处理逻辑。如下是一种状态独立的有限状态机: 这是一个简单的有限状

    2023年04月25日
    浏览(10)
  • mysql从传统模式切到GTID模式后启动主从,主从异常报错1236

    mysql从传统模式切到GTID模式后启动主从,主从异常报错1236

    一 前言   MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到“Got fatal error 1236 from master when reading data from binary log” 这类的报错/报警。本文整理了常见的几种 error 1236 报错

    2024年02月12日
    浏览(9)
  • 银河麒麟V10 SP3 X86 二进制文件部署 mysql-5.7.29 GTID 半同步复制的双主架构

    麒麟镜像可以去下面的地方下载,需要自己注册一个账号 麒麟软件生态 Mysql 二进制文件下载地址 老生常谈的问题(这些问题都会影响部署的排查) 关掉 firewalld 关掉 selinux (银河麒麟默认会关闭 selinux) 我下载的海光 x86 版本的麒麟 mysql 的 AB 复制和 gtid 复制的优缺点 抄自

    2024年02月13日
    浏览(16)
  • mysql8.0版本降到5.7版本(下载配置mysql5.7压缩包版本)

    mysql8.0版本降到5.7版本(下载配置mysql5.7压缩包版本)

    目录 一、前言 二、官网下载与解压 三、配置环境变量 四、检查测试当前MySQL版本 五、获取资源 在部署项目的时候,有时候8.0版本的MySQL就会报错,这个时候就要换MySQL的版本了,5.7的版本还是比较稳定的。 1. 去到MySQL的官网进行下载mysql5.7的压缩包 官网压缩包:MySQL :: Dow

    2024年04月12日
    浏览(13)
  • docker 启动mysql:5.7报错

    docker 启动mysql:5.7报错

    docker 启动mysql容器报错 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.41-1.el7 started. 2023-04-17 09:41:14+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config         command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.QXg3gZVFVb         mysqld: Can\\\'t read dir of \\\'/etc/mysql/conf.d/\\\' (Errcode: 2

    2024年02月11日
    浏览(22)
  • 【Windows上同时安装两个不同版本MYSQL】MySQL安装教程--5.7和8.0版本

    【Windows上同时安装两个不同版本MYSQL】MySQL安装教程--5.7和8.0版本

    最新版本8.0.34下载链接:https://dev.mysql.com/downloads/mysql/ MySQL 5.7下载链接:https://downloads.mysql.com/archives/community/ 使用解压工具将下载到的压缩包解压:如:解压到D:/software/目录下(自己选择),解压之后建议重命名该解压出来的文件:如mysql-8.0.34-winx64文件夹名,可将后面的wi

    2024年02月08日
    浏览(26)
  • windows 10安装MySQL-5.7版本全流程教程

    windows 10安装MySQL-5.7版本全流程教程

    一、通过以下网址下载MySQL-5.7版本:  地址: https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip(网址来源于韩老师的视频分享); 二、将zip压缩包解压到自己创建的文件夹,解压后,压缩包可自行删除或者保留备份; 三、配置MySQL的环境变量,点击电脑属性,然后找到

    2024年02月13日
    浏览(14)
  • Mysql:5.1升级5.6遇到的问题及解决方式

    yum是不可行的.因为yum源没更新,我已经使用了163网易的源,但是还是不行.最新版仍然不是5.6.没办法,mysql分区是5.5之后的功能,要使用分区功能,就必须升级.. 去官网下载地址:MySQL :: Download MySQL Community Server, 下载了全部包. 报 错.file /usr/share/mysql/charsets/README from install of MySQL-server

    2024年01月25日
    浏览(13)
  • 打破限制!MySQL 5.7至8.0跨版本迁移,1分钟搞定多版本数据迁移

    打破限制!MySQL 5.7至8.0跨版本迁移,1分钟搞定多版本数据迁移

    在上个月,MySQL 5.7 正式结束了生命周期,即EOL(End of Life),意味着Oracle将不再为 MySQL 5.7 提供技术支持,包括Bug修复或安全漏洞,大大增加了使用数据库的风险。在全球关系型数据库市场中,MySQL 市场份额最高,在MySQL各版本使用中,5.7 仍占据大部分比例,其次是 5.6 和 8

    2024年02月05日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包