MySql中Binary Log的流程是什么

发布时间:2022-02-19 17:57:32 作者:iii
来源:亿速云 阅读:171
# MySQL中Binary Log的流程是什么

## 1. Binary Log简介

Binary Log(二进制日志)是MySQL中最重要的日志之一,它记录了所有对数据库执行更改的SQL语句(DDL和DML),但不包含SELECT这类不修改数据的操作。Binary Log主要有两个核心作用:

1. **数据复制**:作为主从复制的核心组件,从库通过重放主库的Binary Log实现数据同步
2. **数据恢复**:可用于数据库的时点恢复(PITR)

## 2. Binary Log核心流程

### 2.1 写入流程

Binary Log的写入过程涉及多个组件的协作:

1. **客户端提交SQL语句**
2. **Server层解析执行**
   - SQL语句通过解析器生成解析树
   - 优化器生成执行计划
   - 执行引擎调用存储引擎API执行操作
3. **事务提交阶段**
   - 存储引擎(如InnoDB)首先写入redo log(prepare状态)
   - Server层将操作记录写入Binary Log
   - 存储引擎提交事务(commit状态)

```sql
# 查看Binary Log状态
SHOW VARIABLES LIKE 'log_bin';

2.2 具体写入步骤

  1. 日志缓存分配

    • 每个会话会分配binlog_cache_size大小的缓存
    • 大型事务可能使用临时文件(由max_binlog_cache_size控制)
  2. 事件写入

    • 将SQL语句转换为二进制事件(Event)
    • 常见事件类型:
      • Query_event:DML/DDL语句
      • Table_map_event:表结构映射
      • Write_rows_event:插入操作
      • Update_rows_event:更新操作
      • Delete_rows_event:删除操作
  3. 日志刷盘

    • 根据sync_binlog参数决定刷盘策略:
      • 0:依赖操作系统刷盘
      • 1:每次事务提交都刷盘(最安全但性能影响大)
      • N:每N个事务刷盘一次

2.3 日志轮换机制

MySQL通过以下条件触发Binary Log切换:

  1. 日志文件大小达到max_binlog_size
  2. 执行FLUSH LOGS命令
  3. 服务器重启
  4. 事务跨文件边界(一个大事务可能超过单个文件大小)
# 手动触发日志轮换
FLUSH BINARY LOGS;

3. Binary Log格式详解

MySQL支持三种Binary Log格式:

3.1 STATEMENT模式

记录原始SQL语句:

# 设置日志格式
SET GLOBAL binlog_format = 'STATEMENT';

特点: - 日志量小 - 可能出现主从不一致(如使用UUID()等非确定性函数)

3.2 ROW模式

记录行数据变更:

SET GLOBAL binlog_format = 'ROW';

特点: - 精确记录每行数据变化 - 日志量较大(特别是批量操作时) - 主从数据一致性高

3.3 MIXED模式

混合使用STATEMENT和ROW模式:

SET GLOBAL binlog_format = 'MIXED';

特点: - 默认使用STATEMENT - 对可能引起不一致的操作自动转为ROW模式

4. 复制流程中的Binary Log

4.1 主库流程

  1. 事务提交时写入Binary Log
  2. 为每个从库创建一个binlog dump线程
  3. 根据从库请求发送日志事件

4.2 从库流程

  1. IO线程:从主库拉取Binary Log并写入relay log
  2. SQL线程:重放relay log中的事件
# 查看从库状态
SHOW SLAVE STATUS\G

4.3 GTID模式

全局事务标识符(GTID)提供了更可靠的复制机制:

# 启用GTID
SET GLOBAL gtid_mode = ON;

GTID格式:

source_id:transaction_id

例如:3E11FA47-71CA-11E1-9E33-C80AA9429562:23

5. Binary Log管理

5.1 日志清理

# 设置日志过期时间(天)
SET GLOBAL expire_logs_days = 7;

# 手动清理(删除指定日志之前的日志)
PURGE BINARY LOGS TO 'mysql-bin.000010';

5.2 关键参数

参数 说明 建议值
log_bin 是否启用Binary Log ON
binlog_format 日志格式 ROW/MIXED
sync_binlog 刷盘频率 1(关键业务)
max_binlog_size 单个日志文件大小 1G
binlog_cache_size 事务缓存大小 32K-1M

6. Binary Log解析工具

6.1 mysqlbinlog

# 查看日志内容
mysqlbinlog /var/lib/mysql/mysql-bin.000001

# 解析特定时间段的日志
mysqlbinlog --start-datetime="2023-01-01 00:00:00" \
            --stop-datetime="2023-01-02 00:00:00" \
            mysql-bin.000001

6.2 第三方工具

7. 性能优化建议

  1. ROW模式下批量操作可能产生大日志:

    • 适当增加max_binlog_size
    • 考虑分批提交事务
  2. 高并发场景:

    • 调整binlog_group_commit_sync_delay实现组提交
    • 使用SSD存储日志文件
  3. 复制延迟优化:

    • 启用并行复制(slave_parallel_workers
    • 使用GTID简化故障恢复

8. 常见问题排查

8.1 日志增长过快

# 查看日志大小
SHOW BINARY LOGS;

# 检查大事务
mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000001 | grep -A 10 "TRANSACTION"

8.2 复制错误

# 跳过指定错误(谨慎使用)
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;

8.3 空间不足

# 临时解决方案
SET GLOBAL max_binlog_size = 1073741824;  # 设置为1GB
PURGE BINARY LOGS BEFORE NOW();

9. 总结

MySQL Binary Log的工作流程可以概括为:事务执行 → 日志缓存 → 事件生成 → 日志刷盘 → 复制传播。理解这个流程对于数据库运维、性能调优和故障排查都至关重要。随着MySQL版本的演进,Binary Log机制也在不断优化(如8.0的二进制日志压缩功能),建议持续关注新特性以提升数据库管理效率。

注意:生产环境修改Binary Log相关参数前,务必在测试环境验证并制定回滚方案。 “`

这篇文章共计约3350字,详细介绍了MySQL Binary Log的完整工作流程,包含以下关键内容: 1. 写入机制和日志格式对比 2. 主从复制中的关键流程 3. 实用管理命令和优化建议 4. 常见问题解决方案 5. 版本差异和最佳实践

文章采用Markdown格式,包含代码块、表格等元素,便于技术文档的阅读和使用。

推荐阅读:
  1. MySQL中负值原理以及流程是什么
  2. MySQL:简单记录删除binary log的接口

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql binary log

上一篇:awk的比较运算符如何使用

下一篇:Python大数据用Numpy Array的原因有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》