MySQL Binlog的样式

ops/2025/3/15 20:27:15/

一、Binlog 的基本概念与记录内容

Binlog 是 MySQL 的二进制日志,以事件形式记录所有对数据库的修改操作,包括:

  • DDL 操作:如 CREATEALTERDROP 等表结构变更。
  • DML 操作:如 INSERTUPDATEDELETE 等数据修改。
  • 事务信息:事务的开始、提交、回滚状态及执行时间 。

不记录的内容:纯查询语句(如 SELECTSHOW),因其不改变数据库状态 。


二、Binlog 的三种格式及其样式

1. STATEMENT 格式
  • 记录方式:保存原始的 SQL 语句。

  • 示例

    UPDATE users SET name='Alice' WHERE id=1;
    
  • 特点

    • 优点:日志量小,性能高,适合批量操作 。
    • 缺点:依赖上下文(如时间函数 NOW()UUID()),可能导致主从复制不一致 。
    • 适用场景:简单 SQL 操作且主从环境一致的情况 。
2. ROW 格式
  • 记录方式:保存每行数据的具体变更(前镜像和后镜像)。

  • 示例

    ### 更新操作的前后数据
    UPDATE `test`.`users`
    SET@1=1 (id),@2='Bob' (原name),@3=25 (原age)
    WHERE@1=1 (id),@2='Alice' (新name),@3=25 (新age);
    
  • 特点

    • 优点:精确记录行变更,确保主从数据严格一致 。
    • 缺点:日志量大(如全表更新时),可能影响磁盘 I/O 。
    • 适用场景:需要强一致性的场景(如金融系统)或涉及非确定性函数的操作 。
3. MIXED 格式
  • 记录方式:混合模式,根据 SQL 类型自动选择 STATEMENT 或 ROW。

    • 默认使用 STATEMENT,但遇到非确定性函数(如 RAND()NOW())时切换为 ROW 。
  • 示例

    -- 使用 NOW() 函数时,自动转为 ROW 格式
    INSERT INTO logs (message, created_at) VALUES ('test', NOW());
    
  • 特点

    • 优点:平衡性能与一致性,减少手动调整需求 。
    • 缺点:复杂场景下可能无法完全规避复制问题 。
    • 适用场景:通用场景,尤其适合动态 SQL 操作 。

三、Binlog 记录的具体示例

1. STATEMENT 格式的 Binlog 内容
# 时间戳和事件位置
# at 1234
#240312 10:00:00 server id 1  end_log_pos 1300
SET TIMESTAMP=1710223200;
UPDATE users SET balance=balance-100 WHERE id=1;
2. ROW 格式的 Binlog 内容
# 行变更详情(Base64 编码)
### UPDATE `test`.`users`
### WHERE
###   @1=1 (id)
###   @2=500 (原balance)
### SET
###   @2=400 (新balance)
3. MIXED 格式的 Binlog 内容
# 自动选择模式示例
# Statement 模式记录表结构变更
ALTER TABLE users ADD COLUMN email VARCHAR(255);# Row 模式记录含非确定性函数的操作
INSERT INTO orders (user_id, amount, created_at) VALUES (1, 100, NOW());

四、如何查看 Binlog 内容

1. 通过 MySQL 命令行工具
  • 查看日志列表

    SHOW BINARY LOGS;
    
  • 查看指定日志事件

    SHOW BINLOG EVENTS IN 'mysql-bin.000001' FROM 1234 LIMIT 10;
    
mysqlbinlog__109">2. 使用 mysqlbinlog 工具
  • 解析日志文件

    mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000001
    
    • 参数说明
  • --base64-output=decode-rows:解码 ROW 格式的日志。

  • -vv:显示详细变更信息 。

  • 按时间过滤

    mysqlbinlog --start-datetime="2025-03-12 10:00:00" mysql-bin.000001
    

五、格式选择建议

场景推荐格式理由
主从复制(强一致性需求)ROW避免函数或存储过程导致的主从不一致
批量数据操作STATEMENT减少日志量,提升性能
通用业务MIXED自动平衡性能与一致性,减少人工干预

六、关键总结

  • Binlog 样式核心差异
    • STATEMENT:记录 SQL 语句,简洁但依赖上下文。
    • ROW:记录行变更,精确但日志量大。
    • MIXED:动态选择,兼顾性能与一致性 。
  • 查看工具:优先使用 mysqlbinlog 解码 ROW 格式,结合过滤参数提高可读性 。
  • 实践建议:根据业务需求选择格式,ROW 适合强一致性场景,STATEMENT 适合批量操作,MIXED 作为折中方案 。

http://www.ppmy.cn/ops/166031.html

相关文章

Webpack 打包详细教程

Webpack 是一个现代 JavaScript 应用的静态模块打包工具,它可以处理 JavaScript、CSS、图片等资源,并优化它们以提高性能。以下是 Webpack 从基础到进阶的详细教程。 1. Webpack 基础概念 Webpack 的核心概念包括: Entry(入口&a…

基于Asp.net的医院病历管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

泽众TestOne推出快速测试用例设计,让自动化更快捷

在当今快速迭代的软件开发环境中,测试用例设计的效率和质量直接关系到软件交付的速度和质量。传统测试用例设计方法往往依赖于测试人员的经验,经验不足的测试人员可能无法识别潜在的测试场景,导致关键问题被遗漏。同时,传统方法在…

2020年蓝桥杯第十一届CC++大学B组(第一次)真题及代码

目录 1A:跑步训练(填空5分_模拟) 2B:纪念日(填空5分_日期计算) 3C:合并检测(填空10分_数学) 4D:REPEAT程序(填空10分_模拟) 5E&a…

算法随笔_73: 跳跃游戏

上一篇:算法随笔_72: 最大子数组和-CSDN博客 题目描述如下: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true &#x…

泛微ecode的页面开发发送请求参数携带集合

1.在开发过程中我们难免遇见会存在需要将集合传递到后端的情况,那么这里就有一些如下的注意事项,如以下代码: // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…

【C++】每日一练(链表的中间结点)

本篇博客给大家带来的是用C语言来解答找中间结点! 🐟🐟文章专栏:每日一练 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享! 今日思想:不服输的…

MyBatis 如何解析 XML 配置文件和 SQL 映射文件

MyBatis 使用 SAX(Simple API for XML)解析器来解析 XML 文件,SAX 是一种基于事件驱动的 XML 解析方式,具有高效、低内存消耗的优点。 MyBatis 主要解析两种类型的 XML 文件: 核心配置文件 (mybatis-config.xml): 定…