主从数据不一致竟然不报错?

MySQL 主从同步报错:`Unknown or incorrect time zone` 问题全解析 当你在配置 MySQL 主从同步时,如果遇到以下错误提示,是不是感觉有点懵? 阅读详情

一个线上数据丢失故障案例,引出了在 GTID 模式下 AUTO POSITION MODE 的必要性。

作者:孙绪宗

新浪微博 DBA 团队工程师,主要负责 MySQL、PostgreSQL 等关系型数据库运维。

本文来源:原创投稿

* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

阅读前需知

  • Retrieved_Gtid_Set:从库已经接收到主库的事务编号(从库的 IO 线程已经接受到了)。
  • Executed_Gtid_Set:已经执行的事务编号(从库的执行 SQL 线程已经执行了的 SQL)。

故障现象

主从数据不一致,但是看复制是正常状态(双 Yes)。此时主库执行,从库本该报错 1062 或者 1032 的 SQL,从库复制线程还是双 Yes,没有报错。

MySQL 版本:5.7.35

故障复现

查看主库状态

MySQL [xuzong]> show master status;
+------------------+----------+--------------+------------------+-----------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                             |
+------------------+----------+--------------+------------------+-----------------------------------------------+
| mysql-bin.000008 | 39349641 |              |                  | c233aec0-58d3-11ec-a74a-a0a33ba8b3ff:1-104345 |
+------------------+----------+--------------+------------------+-----------------------------------------------+

从库上只需要设置 GTID 值的 gno 大于主库的值即可复现。

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> reset slave all;
Query OK, 0 rows affected (0.01 sec)

mysql> reset master;
Query OK, 0 rows affected (0.01 sec)

mysql> set @@GLOBAL.GTID_PURGED='c233aec0-58d3-11ec-a74a-a0a33ba8b3ff:1-1000000'; #1000000>104345
Query OK, 0 rows affected (0.00 sec)

然后用 POSITION MODE 点位复制,启动从库,执行 show slave status \G 就会看到如下:

 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes 
 ......
 Last_IO_Error_Timestamp: 
 Last_SQL_Error_Timestamp: 
           Master_SSL_Crl: 
       Master_SSL_Crlpath: 
       Retrieved_Gtid_Set: c233aec0-58d3-11ec-a74a-a0a33ba8b3ff:104221-104345
        Executed_Gtid_Set: c233aec0-58d3-11ec-a74a-a0a33ba8b3ff:1-1000000
            Auto_Position: 0
     Replicate_Rewrite_DB: 

双 Yes,看上去一点问题都没有,但是这时候在主库执行任何操作,都不会被复制,因为复制时校验 GTID 时从库表示已经执行过了。

主库

MySQL [xuzong]> insert into test(passtext) values('test');
Query OK, 1 row affected (0.00 sec)

从库

mysql> select * from xuzong.test;
+----+----------------------------------+
| id | passtext                         |
+----+----------------------------------+
|  1 | 7e5a44af63552be3f2f819cebbe0832a |
|  2 | 7e5a44af63552be3f2f819cebbe0832a |
|  3 | 7e5a44af63552be3f2f819cebbe0832a |
|  4 | d13baf7019431e0c75dee85bc923a91b |
|  5 | 11                               |
+----+----------------------------------+
5 rows in set (0.00 sec)

# 从库能看出来 Retrieved_Gtid_Set 在变化
mysql> show slave status \G
           Retrieved_Gtid_Set: c233aec0-58d3-11ec-a74a-a0a33ba8b3ff:104221-104367
            Executed_Gtid_Set: c233aec0-58d3-11ec-a74a-a0a33ba8b3ff:1-1000000

问题在于,这种不应该报错嘛,从库的 GTID 大于主库的 GTID ???

猜测

根源在于没有设置 Auto_Position=1,那么接下来验证一下猜测。

                Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Slave has more GTIDs than the master has, using the master's SERVER_UUID. This may indicate that the end of the binary log was truncated or that the last binary log file was lost, e.g., after a power or disk failure when sync_binlog != 1. The master may or may not have rolled back transactions that were already replicated to the slave. Suggest to replicate any transactions that master has rolled back from slave to master, and/or commit empty transactions on master to account for transactions that have been'
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1362229455
                  Master_UUID: c233aec0-58d3-11ec-a74a-a0a33ba8b3ff
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 230817 11:11:44
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: c233aec0-58d3-11ec-a74a-a0a33ba8b3ff:1-1000000
                Auto_Position: 1

果不其然报错了,验证了猜测。

问题处理

这种情况目前看只能重做从库。

因为案例中复制进程为双 Yes,无法被监控捕获,同时无法得知数据不一致出现的时间点,所以无法通过分析 binlog 恢复。

本案例中的实例还进行过主从切换,只能联系业务方做一次全量的数据对比,得到一个完整数据的实例,然后重新构建从库。

总结

最后总结一下 Auto_Position 的作用。

  1. 会立即清理原来的 Relay Log。
  2. 根据从库的 Executed_Gtid_Set 和 Retrieved_Gtid_Set 的并集定位 Binlog。MASTER_LOG_FILE 和 MASTER_LOG_POS 不存实例的值。

生产上实例开了 GTID 的话,主从复制建议用 AUTO_POSITION MODE 的方式,即 Auto_Position=1。避免一些未知操作导致从库复制线程没有预期的报错,进而导致从库未正确复制,数据丢失。

拓展:源码解读

rel_slave.cc
    --> request_dump

部分源码:
.....
  enum_server_command command= mi->is_auto_position() ?
    COM_BINLOG_DUMP_GTID : COM_BINLOG_DUMP;
......
  if (command == COM_BINLOG_DUMP_GTID)
  {
    if (gtid_executed.add_gtid_set(mi->rli->get_gtid_set()) != RETURN_STATUS_OK || // 加Retrieved_Gtid_Set
        gtid_executed.add_gtid_set(gtid_state->get_executed_gtids()) !=
        RETURN_STATUS_OK) // 加Executed_Gtid_Set
......
    int2store(ptr_buffer, binlog_flags);
    ptr_buffer+= ::BINLOG_FLAGS_INFO_SIZE;
    int4store(ptr_buffer, server_id);
    ptr_buffer+= ::BINLOG_SERVER_ID_INFO_SIZE;
    int4store(ptr_buffer, static_cast<uint32>(BINLOG_NAME_INFO_SIZE));
    ptr_buffer+= ::BINLOG_NAME_SIZE_INFO_SIZE;
    memset(ptr_buffer, 0, BINLOG_NAME_INFO_SIZE); // 设置MASTER_LOG_FILE为0
    ptr_buffer+= BINLOG_NAME_INFO_SIZE;
    int8store(ptr_buffer, 4LL); // 设置MASTER_LOG_POS为4
    ptr_buffer+= ::BINLOG_POS_INFO_SIZE; // 存gtid_set

如果 relay_log_recovery 是打开的,则忽略 Retrieved_Gtid_Set 值。

    /*
      In the init_gtid_set below we pass the mi->transaction_parser.
      This will be useful to ensure that we only add a GTID to
      the Retrieved_Gtid_Set for fully retrieved transactions. Also, it will
      be useful to ensure the Retrieved_Gtid_Set behavior when auto
      positioning is disabled (we could have transactions spanning multiple
      relay log files in this case).
      We will skip this initialization if relay_log_recovery is set in order
      to save time, as neither the GTIDs nor the transaction_parser state
      would be useful when the relay log will be cleaned up later when calling
      init_recovery.
    */ // 注释解释的很清楚,relay_log_recovery=1 会跳过初始化 gtid_retrieved_initialized
    if (!is_relay_log_recovery &&
        !gtid_retrieved_initialized &&
        relay_log.init_gtid_sets(&gtid_set, NULL,
                                 opt_slave_sql_verify_checksum,
                                 true/*true=need lock*/,
                                 &mi->transaction_parser, &gtid_partial_trx))
    {
      sql_print_error("Failed in init_gtid_sets() called from Relay_log_info::rli_init_info().");
      DBUG_RETURN(1);
    }
    gtid_retrieved_initialized= true;
#ifndef NDEBUG
    global_sid_lock->wrlock();
    gtid_set.dbug_print("set of GTIDs in relay log after initialization");
    global_sid_lock->unlock();
#endif

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
MySQL 主从同步报错:​​Unknown or incorrect time zone​​ 问题全解析 MySQL 主从同步报错:Unknown or incorrect time zone 问题全解析前言当你在配置 MySQL 主从同步时,如果遇到以下错误提示,是不是感觉有点懵?Error 'Unknown or incorrect time zone: 'US/Pacific'' on query. Default da... 阅读详情

相关推荐

先进封装技术 Part03---重布线层(RDL)的科普

RDL是一种在芯片封装过程中用于重新分布电气连接的技术。它通过在芯片表面或中介层上形成额外的布线层,重新分配芯片的I/O(输入/输出)位置,以适应不同的封装需求和提高电气连接的灵活性。

阿拉伯梳子的专栏 4701

MySQL GTID详解

MySQL在5.6版本推出了GTID复制,相比传统的复制,GTID复制对于运维更加友好,这个事物是谁产生,产生多少事物,非常直接的标识出来。 今天将讨论一下 关于从库show slave status 中的Retrieved_Gtid_Set 和 Executed_Gtid_Set. Retrieved_Gtid_Set : 从库已经接收到主库的事务编号 Executed_Gtid_Set ...

woailyoo0000的博客 2万+

ADRV9009的学习历程(一)

** AD9361的同胞ADRV9009 ** 终于记录一下了 距离第一次想写博客记录自己学习的点点滴滴,大概已经过去有一年有余。一直都是停留在心有余而力不足的境界。 基本每次做项目遇到问题都会来优快云寻求帮助,这里虽离庙堂较远,但高手云集。每每读来,思绪万千,次次膜拜。 趁这次又学习了一样新物件,就记录一下,望大神看见能赐教一下。 ADRV9009 最近有项目要用到ADRV9009这个芯片。就来学习一下。做过AD9361的都知道,ADI官方会给出这个芯片的参考手册、数据手册和驱动程序。当然我只是见过AD

weixin_42868560的博客 1万+

Slave has more GTIDs than the master has, using the master‘s SERVER_UUID

机房掉电,con Last_IO_Errno: 1236 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Slave has more GTIDs than the master has, using the master's SERVER_UUID. This may indicate that the end of the binary log was truncated o..

lwei_998的专栏 3269

AI智能体项目管理框架agent-pm:从原理到实战的多智能体协作指南

在人工智能和自动化技术快速发展的今天,多智能体系统已成为实现复杂任务自动化的重要技术路径。其核心原理在于通过任务分解、角色分配和状态管理,让多个AI智能体像人类团队一样协同工作,从而突破单个模型的性能边界。这种架构的技术价值在于将软件工程中成熟的项目管理方法论引入AI领域,显著提升了自动化流程的可预测性、可观测性和可复用性。在实际应用场景中,多智能体协作框架能够高效处理从代码开发、文档撰写到数据分析等一系列任务,尤其适合需要多步骤、多专业协同的复杂项目。本文聚焦的agent-pm框架,正是这一领域的典型实践

weixin_42533910的博客 714

达妙电机MIT模式调参实战:如何从‘曲线偏离’到‘完美追踪’正弦波?

本文详细解析了达妙电机MIT模式调参实战,从曲线偏离到完美追踪正弦波的方法论。通过MATLAB实时曲线分析,深入探讨位置环(kp)和速度环(kd)的双重调节技巧,帮助工程师优化参数组合,提升电机控制精度和稳定性。

weixin_29053073的博客 731

MySQL的Retrieved_Gtid_Set、Executed_Gtid_Set哪里来

验证环境 MySQL 5.7.23 Centos7.4 relay_log_recover=0 验证过程 slave mysql> start slave; shQuery OK, 0 rows affected (0.45 sec) mysql> show slave status\G **************************...

weixin_33932129的博客 5398

自动驾驶IDM与MOBIL模型

IDM模型,自动驾驶

不想学好数学的汽车工程师不是一个好的程序员 1万+

mysql的GTID同步原理介绍及详细配置过程

介绍mysql的GTID主从同步原理以及详细配置过程

m0_58833554的博客 2386

【nvidia-B200 生产环境】NVIDIA 570.124.06+Cuda12.8 Ubuntu22.04 nccl-test 一键部署脚本(免修改复制即用)

目录1. 初始化与日志记录2. 安装基础工具与配置更新3. NVIDIA 驱动安装 570.124.064. 安装 Mellanox OFED 24.10-2.1.8.05. 安装 CUDA 12.86. 安装 NCCL 和测试7. 配置 rc.local 和其他优化8. B200 单独步骤9. 最终测试与重启10. 完整生产脚本,复制即可直接使用总结 功能: 设置日志目录和日志文件路径。 使用 命令将标准输出和错误输出同时写入日志文件和终端。 记录脚本开始时间,并计算开始的秒数

jundao1997的专栏 2797

时间序列分析(Time Series Analysis) 原理与代码实例讲解

时间序列分析(Time Series Analysis) - 原理与代码实例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 关键词:时间序列预测,ARIMA模型,状态空间模型,SARIMA模型,机器学习

AI天才研究院 1246

级联主从,从库数据不一致,不报错

7 级联主从,中间库和主库数据一致,从库和中间库之间数据不一致。show slave status ,状态无异常,错误日志无报错。 解决:目前定位 中间库 log_slave_updates 参数没开. ...

weixin_42255811的博客 228

用一组可复现实验讲清 ABAP 内表 Standard / Sorted / Hashed 的性能差异

摘要(150字): SAP项目中性能问题常源于ABAP内表选型不当。标准表(STANDARD TABLE)写入快但查找慢(线性扫描),适合遍历场景;排序表(SORTED TABLE)保持有序,支持二分查找,适合范围查询;哈希表(HASHED TABLE)基于唯一键实现常数级查找,适合高频精确匹配。实验表明:标准表+BINARY SEARCH需预排序,成本可能高于直接使用排序表;哈希表在键匹配时性能最优。Gateway和RAP场景中,内表选型直接影响接口响应,建议根据读写负载(追加/遍历/精确查找)选择对应类

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 201

MySQL主从数据不一致?这篇保姆级攻略带你定位+解决!

MySQL主从数据不一致是指主库(Master)与从库(Slave)之间的数据内容或状态出现差异的现象,这是生产环境中常见的问题,可能导致业务逻辑错误、故障切换风险等。本文将从原因分析、检测方法、解决策略和预防措施四个维度详细解析。

weixin_42148384的博客 2196

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MySQL主从同步故障:cannot be converted from type ‘varchar(30(bytes))‘ to type ‘varchar(9(bytes) utf8)‘

总结:这个报错无非就是两个问题: 主从数据库的数据库不一致 或 数据表字段不一致

走在搬砖的路上! 5732

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mysql5.7同步复制报错1060故障处理

mysql5.7同步复制报错故障处理# 报错 1060,具体如下Last_Errno: 1060Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 0 failed executing transaction ...

reblue520的专栏 1378

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

MySQL主从异常Coordinator stopped because there were error(s) in the worker(s). The most recent failur

gtid方式主从数据不一致,同步数据时报错。可以看到具体的出错信息。

yugi987838的博客 622

GreatSQL从库报错13146:字符集不一致问题处理

表中相关信息,可以看到contact列、tel列的字符集都为utf8mb4,排序规则为默认的 utf8mb4_0900_ai_ci;这段描述可以解释为什么在创建表时,如果没有明确指定列的字符集,则会使用该表或数据库的默认字符集。这意味着,如果为VARCHAR类型的列没有指定字符集,它将继承表或数据库层面定义的字符集。的方式进行数据恢复后配置同步,从库发生报错13146数据类型转换失败,导致同步异常;表的字符集两边不一致,主库为utf8mb3,从库为utf8mb4,那么所属列的字符集是否一致呢?

GreatSQL2021的博客 589

!!!Linux下基于GTID的Mysql主从复制时,数据不一致的处理办法(mysql版本:mysql-5.7.24)——SQL线程异常

续我的上篇博文:https://mp.youkuaiyun.com/postedit/87896993 1.在主库和从库上准备数据 从库上操作: [root@server2 mysql]# mysql -pXinjiaojiao+623 mysql> use westos; mysql> update usertb set password='456' where userna...

qq_42303254的博客 552

GTID不一致修复

如果发生过主从切换,新主库可能没有完整保留旧主库的全部GTID历史。从库是基于某个备份恢复的,该备份包含了主库已清除的GTID。这些事务可能是之前从其他源(如备份恢复、临时主库)执行的。从库可能曾经连接过其他主库(如测试环境),执行了一些事务。GTID模式下,mysql主从切换后,主从同步报错。即使数据内容一致,GTID序列可能不连续。集合可能包含主库已清除的GTID事务。命令清除了特定GTID之前的日志。3. 重新配置复制并启动。1,master执行。

一条大河 821

mysql主从同步报错

数据库,解决方案相关学习资料:https://edu.51cto.com/video/655.htmlhttps://edu.51cto.com/video/2306.htmlMySQL主从同步报错解决方案 MySQL主从同步是一种常见的数据库高可用性解决方案,通过将主数据库的数据复制到一个或多个从数据库来实现。然而,...

weixin_31582099的博客 335

MySQL主从复制原理学习

master 服务器将数据的改变记录二进制 binlog 日志,当 master 上的数据发生改变时,则将其改变写入二进制日志中;slave 服务器会在一定时间间隔内对 master 二进制日志进行探测其是否发生改变,如果发生改变,则开始一个 I/OThread 请求 master 二进制事件;

weixin_44265650的博客 810

ogg mysql表结构不一致_OGG主从表结构不同步,出现OGG-01296错误

一、Causeogg的err日志出现以下报错2019-09-10 16:36:55 WARNING OGG-01003 Oracle GoldenGate Delivery for Oracle, repwh2.prm: Repositioning to rba 1720271212 in seqno 1521.2019-09-10 16:36:55 ERROR OGG-01296 ...

weixin_33549415的博客 588

MySQL主从同步跳过报错

MySQL主从复制跳过报错 前提是主从复制不同步,从库提前性质的执行过了sql语句,导致主从数据库数据不同步。 跳过事务,必须要知道,数据是否同步,如果数据不同步则会导致数据出问题。 一、传统得binlog主从复制,跳过报错的方法。 stop slave; set global sql_slave_skip_counter = 1; start slave; show slave status \G 二、GTID 主从复制跳过.报错的方法 show slave status \G /* 找参数LAST_E

Junzizhiai的博客 1417

MySQL主从复制报错13146,如何快速定位与修复?

需要将数据反向同步到源端,在使用。

2501_92554714的博客 683
上一篇: OceanBase安全审计之传输加密
下一篇: MySQL 8 的复制可观测性
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值