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

MySQL Binlog的样式

一、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;
    
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.kler.cn/a/582397.html

相关文章:

  • 人工智能驱动数字孪生城市的实践探索
  • 展望 AIGC 前景:通义万相 2.1 与蓝耘智算平台共筑 AI 生产力高地
  • 六、OpenGL中EBO的使用及本质
  • 汽车NVH诊断案例 | 纯电车急加速过大弯底盘异响
  • 17.JavaScript 自动化侦察工具
  • 前馈神经网络 - 参数学习(优化问题)
  • VSTO(C#)Excel开发4:打印设置
  • Mac java全栈开发环境配置
  • MATLAB代码开发实战:从入门到高效应用
  • 基于springboot + vue 的实验室(预约)管理系统
  • 3. 自定义类型****
  • 批量给 Excel 表格添加文字和图片水印
  • Java程序开发之Spring Boot快速入门:5分钟搭建RESTful API
  • 以下是基于文章核心命题打造的15个标题方案,根据传播场景分类推荐
  • 在线商城服务器
  • c++介绍线程的屏障 八
  • C++入门——内联函数、auto关键字、基于范围的for循环
  • FastDDS中Utils定义的那些数据结构(二)
  • 【TMS570LC4357】之工程创建
  • UE5.5 Niagara 发射器粒子更新模块