当前位置: 首页 > news >正文

MySQL:Last_IO_Errno:“0“, Last_IO_Error:““, Last_SQL_Errno:“1950“

目录标题

  • 一、现象(你给出的日志)
  • 二、原因与原理(要点)
  • 三、诊断步骤(先看清当前状况,**只读操作**优先)
  • 四、可选的、安全的解决方案(按风险从低到高)
    • 方法 A — 最安全(推荐)
    • 方法 B — 如果你确实能确认某些 GTID 是“可以丢弃/跳过”的(高风险,不推荐在生产随意使用)
    • 方法 C — 针对多源 / 切换主引起的冲突
  • 五、具体建议(步骤化、可执行)
  • 六、避免复发的操作与良好实践

一、现象(你给出的日志)

Replica 报错(Slave_SQL_Running = No),错误信息(Last_SQL_Error):

An attempt was made to binlog GTID 1109121115-1109810028-61915841 which would create an out-of-order sequence number with existing GTID 1109121115-1109810028-61917163, and gtid strict mode is enabled

你说“在主库锁了FLUSH LOGS,再重做备库就可以了”。下面解释为什么发生、为什么FLUSH LOGS有时能“解决”、以及标准、安全的处理方法。


二、原因与原理(要点)

  1. GTID 的语义
    GTID(格式类似source_id-server_id-transaction_id)用于标识每一笔事务。副本在应用事务时,会检查 GTID 的顺序性,确保不会出现“回退/重复/乱序”应用事务。

  2. 错误的含义
    错误信息说明:副本上已经存在同一 source(1109121115-1109810028)下的更大的事务序号61917163,而 Master 现在要发送的 GTID 为61915841(比已存在的要小)。在gtid_strict_mode或 GTID 模式下,这是不允许的 —— 因为这表示要在已执行更高序号的基础上再执行一个“更旧”的序号,可能导致不一致或重复。

  3. 典型触发场景(常见几类原因)

    • 你把某个备库或其他服务器上的事务导入到当前 replica,导致 replica 的Executed_Gtid_Set包含了 Master 没有的、但序号更高的 GTID。
    • 以前在 replica 上意外做了写操作(非只读),产生了 GTID,或用不一致的备份恢复(比如恢复了来自不同时间点/不同主机的 binlog),导致 GTID 集不连续。
    • 多源/切换主库操作中,master/backup 的 GTID 集不同步。
    • server_uuid冲突或错误的备份恢复方法(没有正确处理 gtid_purged / gtid_executed)也能引发类似问题。
  4. 为什么FLUSH LOGS有时“能解决”
    FLUSH LOGS会切换/生成新的二进制日志文件(rotate binary log)。在某些临时场景,这样做的副作用会让你用新的起点重新建立复制(比如你随后从新的 binlog 文件起点重新建立复制或用新的备份做同步),从而避开发送那个“旧的” GTID。但这只是在某些特定流程下碰巧对齐了 GTID 集 —— 本质上不是根本修复。如果副本的Executed_Gtid_Set已包含比 master 当前发出的序号更高的 GTID,单纯 rotate binlog 并不会修改已经存在于副本上的 GTID 集;通常是你在重建备库时以某种方式对齐了起点,所以看起来“可行”。


三、诊断步骤(先看清当前状况,只读操作优先)

在 master / replica 上执行下面命令,记录输出以便判断差异:

在 Master 上:

SHOWGLOBALVARIABLESLIKE'gtid_mode';SHOWGLOBALVARIABLESLIKE'enforce_gtid_consistency';SHOWMASTERSTATUS\GSHOWBINARYLOGS;SELECT@@server_uuid;

在 Replica 上(报错的那个):

SHOWSLAVESTATUS\G-- 注意 Last_IO_Error / Last_SQL_Error / Executed_Gtid_Set / Retrieved_Gtid_SetSELECT@@server_uuid;SHOWGLOBALVARIABLESLIKE'gtid_mode';

重点看:

  • Executed_Gtid_Set(副本已经执行的 GTID 集)
  • Retrieved_Gtid_Set(副本已接收但未执行的 GTID)
  • Master 的SHOW MASTER STATUS返回的FilePositionGTID相关信息
  • server_uuid是否有冲突

四、可选的、安全的解决方案(按风险从低到高)

方法 A — 最安全(推荐)

彻底重新同步副本(从 master 做一次一致性备份,然后恢复到副本,启用 GTID 自动定位)
步骤大致:

  1. 在 Master 上做一致性备份(推荐使用 XtraBackup 或 LVM snapshot),或 mysqldump(对生产建议使用物理备份)。备份时记录 master 的 GTID 状态(SHOW MASTER STATUS/GTID_EXECUTED)。
  2. 在 replica 上停止 slave 并清理旧的 relay log:
STOP SLAVE;RESET SLAVEALL;-- MySQL 5.7+, 注意这会删除复制配置信息
  1. 恢复备份到 replica(确保数据目录为空或按备份指示恢复)。
  2. 在 replica 上设置复制:
CHANGE MASTERTOMASTER_HOST='master_host',MASTER_USER='repl',MASTER_PASSWORD='...',MASTER_AUTO_POSITION=1;STARTSLAVE;

这保证 master 和 replica 的 GTID 集一致,消除 out-of-order。

优点:安全、长远;缺点:需要数据传输/恢复时间。


方法 B — 如果你确实能确认某些 GTID 是“可以丢弃/跳过”的(高风险,不推荐在生产随意使用)

注意:GTID 模式下不能像传统非-GTID那样用SQL_SLAVE_SKIP_COUNTER随意跳过。错误处理需要非常谨慎。

  1. 如果 replica 是空的新服务器,或者你确认要“重置”它的已执行 GTID(非常危险,会影响数据一致性),可以在停止服务器、清空数据目录后,用:
SETGLOBALgtid_purged='已知安全的GTID_SET';

gtid_purged只能在datadir为空时设置。通常只有在新建实例或完全重新初始化时使用。

  1. 对于已有数据并想“修复”局部冲突,没有通用的安全 SQL 指令。通常需要重建从库或人工对比并补数据。

方法 C — 针对多源 / 切换主引起的冲突

如果你做过主库切换、或者启用了多源复制,确保在切换时使用CHANGE MASTER TO ... MASTER_AUTO_POSITION=1并且处理好gtid_purged/gtid_executed。否则建议按方法 A 重建一遍。


五、具体建议(步骤化、可执行)

  1. 先诊断,不要盲目执行修改。把SHOW SLAVE STATUS\G输出贴出来(或核对以下关键字段):Executed_Gtid_Set,Retrieved_Gtid_Set,Master_Log_File,Relay_Master_Log_File,Last_SQL_Error
  2. 如果数据量允许,选择重新做一次从库初始化(方法 A):这是最稳妥的。
  3. 如果必须临时恢复业务且你确认这笔冲突事务是“历史/可舍弃”的(非常少见),可以考虑在测试环境演练“重建从库”或使用gtid_purged在空数据目录上设置(极其谨慎)。
  4. 检查并修正运维流程,避免将备份恢复到副本后不正确处理 GTID 的情况;确保 replica 保持只读(read_only=ONsuper_read_only=ON)以防意外写入。
  5. 检查server_uuidSELECT @@server_uuid;确保每台实例唯一,避免 UUID 冲突导致的 GTID 问题。
  6. 如需快速恢复测试可行性,可把你 Master/Replica 的SHOW MASTER STATUSSHOW SLAVE STATUS\G输出贴上来,我可以基于真实输出给出更精确的命令和步骤。

六、避免复发的操作与良好实践

  • 生产从库设置read_only=ONsuper_read_only=ON(防止误写)。
  • 备份/恢复时明确记录并处理 GTID(使用支持 GTID 的物理备份工具)。
  • 在做主从切换或打补丁前,先导出/记录当前 GTID 集。
  • 确保每台 MySQL 的server_uuid唯一且正确。
  • 在变更复制拓扑时,优先在测试环境演练 GTID 解析、恢复流程。

如果你愿意,我现在可以基于你当前实例的真实输出给出针对性的修复步骤(例如,假如你打算重建从库,我会给出完整命令序列和注意事项)。请直接把以下输出贴上来(不需要任何额外说明,我会直接给具体步骤):

  • Master:SHOW MASTER STATUS\G的完整输出
  • Replica:SHOW SLAVE STATUS\G的完整输出(特别关注Executed_Gtid_SetLast_SQL_Error
  • SELECT @@server_uuid;在主、备两边的结果
  • SHOW GLOBAL VARIABLES LIKE 'gtid_mode';在主、备两边的结果

总之:错误来源于 GTID 的“顺序/集合”不一致,最安全的修复是用一致性备份重新初始化副本。FLUSH LOGS有时带来巧合性的“对齐效果”,但并非通用或可靠的根治方法。需要我帮你根据真实状态出具体逐步命令吗?

http://www.gsyq.cn/news/86759.html

相关文章:

  • 分布式应用框架Microsoft Orleans - 4、掌握Microsoft Orleans状态管理:从持久化配置到事务处理
  • 2025年12月铝合金母线槽,接插式母线槽,高压母线槽厂商推荐:导电效率+安装便捷度实测​ - 品牌鉴赏师
  • Wan2.2-T2V-A14B能否理解‘情绪’类抽象描述?实验来了
  • 3步掌控Mac性能:AppPolice让你的电脑告别卡顿烦恼
  • 分布式应用框架Microsoft Orleans - 2、动手实践:构建你的第一个Microsoft Orleans应用程序
  • 2025年质量好的隐藏式抽屉滑轨/抽屉滑轨厂家推荐及采购指南 - 行业平台推荐
  • Mirai Console Loader 终极配置指南:从零构建QQ机器人
  • 享扭蛋机比较实用的功能分享
  • 2025年翅片换热器制造企业排名:5大靠谱换热器供应商推 - 工业推荐榜
  • 2025年质量好的线阵音响厂家最新权威推荐排行榜 - 行业平台推荐
  • 银行智能柜员机对话系统升级:Llama-Factory本地化部署案例
  • 2025年市场评价高的实心钢棒直销厂家有哪些,316L不锈钢中厚板 /不锈钢方管/不锈钢无缝管/不锈钢拉丝板/实心钢棒厂家哪个好 - 品牌推荐师
  • Llama-Factory助力科研:快速复现论文实验结果
  • 2025年市场上评价高的污水池清洗公司哪家权威,优质的污水池清洗厂家技术领航者深度解析 - 品牌推荐师
  • C语言实战4
  • 4步生成惊艳图像:Qwen-Image-Lightning如何让AI绘图变得简单快速
  • PentestGPT:AI赋能的渗透测试工具完全指南
  • Cowabunga终极指南:10分钟打造个性化iOS设备
  • Spring Security+JWT问题记录
  • JetBrains Maple Mono字体配置指南:打造完美的编程环境
  • 3000亿参数仅需2卡部署:ERNIE 4.5如何用2比特量化技术重塑企业AI格局
  • 澜舟科技孟子模型微调教程:Llama-Factory操作实例
  • 2025年口碑好的中空壁塑钢缠绕管设备/hdpe缠绕管设备行业内口碑厂家排行榜 - 品牌宣传支持者
  • ConvNeXt终极指南:从零开始掌握现代卷积神经网络
  • 【节点】[Adjustment-Hue节点]原理解析与实际应用
  • Slint布局革命:从布局困境到界面设计高手
  • Avalonia XPF:WPF跨平台迁移的终极解决方案
  • 2025靠谱的卫浴产品企业TOP5权威推荐:甄选企业守护品质 - mypinpai
  • Flutter tobias 库在鸿蒙端的支付宝支付适配实践
  • 友达 G150XTM03.4 工业液晶显示屏:15.0 英寸宽温 eDP 接口场景的显示驱动技术解析