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

MySQL-BinLog是如何做到数据同步的

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程​​​​https://www.captainai.net/troubleshooter

MySQL 的 BinLog(Binary Log,二进制日志)做数据同步,核心原理可以概括为:主库将变更事件写入 BinLog → 从库拉取并回放这些事件。下面分步拆解。

一、BinLog 的三种格式

不同格式直接影响同步内容和效率:

格式记录内容优缺点
STATEMENT执行的 SQL 语句日志小,但可能有不确定性问题(如NOW()
ROW每行数据的实际变更前后值最精确,无歧义,但日志量大(推荐
MIXED混合使用,自动选择兼顾两者,但复杂场景可能不确定

数据同步通常使用ROW 格式,因为它能精确还原变更。

二、标准主从同步流程

主库 从库 | | | 1. 写 BinLog | | 2. 事件写入完成 | |----------------------> 3. I/O 线程拉取 BinLog | | 4. 写入 Relay Log | | 5. SQL 线程回放 | | 6. 数据变更

详细步骤:

  1. 主库事务提交时
    将变更事件按顺序写入 BinLog 文件(每个事务一个或多个事件)。

  2. 从库 I/O 线程
    连接到主库,请求从指定位置(文件名 + 偏移量)开始拉取 BinLog 事件。

  3. 主库 Dump 线程
    负责把 BinLog 事件发送给从库。

  4. 从库接收
    将事件先写入本地的Relay Log(中继日志)

  5. 从库 SQL 线程
    读取 Relay Log,按照与原事务相同的顺序在从库执行这些事件。

  6. 从库数据更新完成
    从库最终与主库数据一致。

三、同步的定位机制(GTID vs 文件名+位置)

从库需要知道“已经同步到哪里了”,以便断点续传。

  • 传统方式:记录(binlog.000001, position 1234)
    缺点:主从切换后找位置复杂。

  • GTID(Global Transaction Identifier)(推荐)
    每个事务有全局唯一 ID(如3E11FA47-71CA-11E1-9E33-C80AA9429562:23)。
    从库只需告诉主库“我已执行了哪些 GTID”,主库自动发送缺失事务。
    优点:主从切换、故障恢复更简单安全。

四、ROW 格式下如何精确同步行变更

比如执行UPDATE users SET age=30 WHERE id=100

  • STATEMENT 格式:记录这条 SQL

  • ROW 格式(关键):

    事件1: before image (id=100, age=25, name='张三') 事件2: after image (id=100, age=30, name='张三')

    从库直接应用“将 id=100 的行从 (25) 改为 (30)”,不依赖 SQL 语义。

这样即使主库有触发器、确定性函数,从库也能精确复制行状态。

五、半同步复制(提升一致性)

默认异步复制:主库提交后不等待从库确认,可能丢数据。
半同步复制

主库提交事务 → 写 BinLog → 等待至少一个从库确认收到 → 才返回客户端 OK

减少主从切换时的数据丢失风险。

六、同步延迟问题及常⻅原因

  • 大事务:一个事务改 1000 万行,主库 BinLog 很大,从库回放慢

  • 从库硬件差:I/O 或 CPU 不足

  • 从库有读负载:同时处理查询和回放

  • ROW 格式下无主键的表:从库更新每行需要全表扫描,极慢

监控命令:SHOW SLAVE STATUS\GSeconds_Behind_Master

七、经典应用场景

除了主从复制,BinLog 还用于:

  • 数据同步到异构系统:如使用 Canal、Debezium 消费 BinLog,写入 Kafka、Elasticsearch、Redis(Canal 模拟 MySQL 从库协议,拉取 ROW 格式事件并解析)

  • 基于 BinLog 的备份恢复:全量备份 + BinLog 可实现时间点恢复(PITR)

总结一句话

BinLog 数据同步 =主库记录变更日志(ROW 格式最佳)→ 从库拉取并按顺序回放 → 通过 GTID 或位点定位进度,从而实现最终一致的副本。

http://www.jsqmd.com/news/792322/

相关文章:

  • 推荐一些恒盛通跨境电商物流的客户案例供大家参考 - 恒盛通物流
  • 如何高效使用ncmdump:从网易云音乐NCM解密到跨平台播放的完整指南
  • MySQL-select ... for update语句详解
  • DBO-Transformer模型回归+SHAP分析+新数据预测+多输出!深度学习可解释分析(附MATLAB代码)
  • CodeWiki代码解读工程
  • 驾驶中的疲劳状态识别数据集分享(适用于YOLO系列深度学习分类检测任务)
  • RPGMZ 战斗结束 移除死亡的角色 并且显示一个消息框 然后结束战斗
  • 武昌/汉口/汉阳找家教:武汉本地老牌大学生家教平台深度测评分:区域走访华中师大家教网,三镇家长的真实满意率是怎么来的 - 教育信息速递
  • 2026届学术党必备的六大AI写作神器推荐
  • 空间智能破界 实景孪生新生
  • 告别ContentProvider臃肿初始化,App Startup实战指南
  • Joy-Con Toolkit:开源手柄调试工具的技术实现与应用
  • 构建个人数字记忆库:微信聊天记录的永久保存与深度分析方案
  • 武汉大学生上门家教一般多少钱?怎么付才最安全不被卷款?——华中师大家教网坚持15年的费用规则:按周月结、直付老师、不预支 - 教育信息速递
  • 内容创作团队如何利用Taotoken调用不同模型生成多样化素材
  • 2026年4月异型钢采购推荐,不锈钢筛管/不锈钢筛板/异型钢/不锈钢型材/三角丝,异型钢批发怎么选择 - 品牌推荐师
  • .NET性能优化:提升Apache Arrow读写性能
  • 以像素解构实景 以孪生赋能城域
  • 一款基于 .Net WinForm 开发的节点编辑器,纯 GDI 实现,体积仅 100+Kb
  • DS4Windows终极指南:3步解决PS4手柄在Windows的游戏兼容问题
  • RPGMZ 万能通用钩子代码 插入自己的代码逻辑
  • 测试包含numpy模块的pocketpy:pocketpy-numpy
  • 在Node.js后端项目中集成Taotoken实现稳定的大模型API调用
  • 软件工程团队第一次作业
  • 如何快速掌握OpenCore配置:面向新手的完整指南
  • 原生视频筑底 全域镜像共生
  • FPGA实战:一种精简可配置位宽的SPI主机Verilog实现
  • 终极视频下载解决方案:VideoDownloadHelper完全使用指南
  • 靠谱糯米鸡机器厂家选择:企业采购决策关键因素分析
  • PCL2启动器:Minecraft玩家的终极免费启动工具完全指南