关于那些mysql的数据读写和日志机制

MySQL底层原理:数据读写与日志机制详解

MySQL的存储引擎主要有InnoDB、MyISAM等,这里主要以InnoDB为例。

一、MySQL数据读写架构概述

MySQL的数据读写操作涉及多个核心组件协同工作,主要包括:

  1. ​InnoDB存储引擎​​:负责实际的数据存储和检索

  2. ​缓冲池(Buffer Pool)​​:内存中的数据结构,缓存表和索引数据

  3. ​日志系统​​:包括redo log、undo log和binlog等,保证数据一致性和持久性

  4. ​事务系统​​:管理ACID特性实现

二、核心日志机制详解

1. Redo Log(重做日志)

1.1 基本概念

Redo log是InnoDB特有的物理日志,记录的是"在某个数据页上做了什么修改",主要用于崩溃恢复(crash-safe)。

1.2 工作原理
  • ​写入流程​​:

    1. 事务修改数据时,先修改Buffer Pool中的页

    2. 生成redo log并写入redo log buffer

    3. 根据配置策略(innodb_flush_log_at_trx_commit)刷盘

  • ​循环写入​​:Redo log文件是固定大小的循环写入结构,包含多个文件(通常2-4个)

1.3 关键配置参数
innodb_log_file_size    # 单个redo log文件大小
innodb_log_files_in_group # redo log文件数量
innodb_log_buffer_size  # redo log缓冲区大小
innodb_flush_log_at_trx_commit # 刷盘策略(0/1/2)
1.4 崩溃恢复

MySQL启动时会检查redo log,将未刷入磁盘的数据页重新应用redo log进行恢复。

2. Undo Log(回滚日志)

2.1 基本概念

Undo log是逻辑日志,记录事务发生前的数据状态,主要用于:

  • 事务回滚

  • 实现MVCC(多版本并发控制)

2.2 存储结构
  • 存储在系统表空间的回滚段(rollback segment)中

  • 每个回滚段有1024个undo slot

  • InnoDB默认有128个回滚段

2.3 生命周期
  • 事务开始时分配undo log

  • 事务提交后放入history list,由purge线程异步清理

2.4 关键参数
innodb_undo_directory      # undo log目录
innodb_undo_tablespaces    # undo表空间数量
innodb_undo_log_truncate   # 是否启用undo log截断
innodb_max_undo_log_size   # undo表空间阈值

3. Binlog(二进制日志)

3.1 基本概念

Binlog是Server层的逻辑日志,记录所有修改数据的SQL语句,主要用于:

  • 主从复制

  • 时间点恢复

3.2 日志格式
  • ​STATEMENT​​:记录SQL语句

  • ​ROW​​:记录行数据变化(默认)

  • ​MIXED​​:混合模式

3.3 写入流程
  1. 事务执行期间将事件写入binlog cache

  2. 事务提交时,binlog cache写入binlog文件

  3. 根据sync_binlog配置决定刷盘时机

3.4 关键参数
log_bin                  # 是否启用binlog
binlog_format            # 日志格式(ROW/STATEMENT/MIXED)
sync_binlog              # 刷盘策略(0/1/N)
binlog_cache_size        # 事务binlog缓存大小
max_binlog_size          # 单个binlog文件大小
expire_logs_days         # binlog过期时间

三、日志协同与两阶段提交

为保证redo log和binlog的一致性,MySQL采用两阶段提交:

  1. ​Prepare阶段​​:

    • InnoDB将事务状态标记为PREPARE

    • 将redo log刷盘

  2. ​Commit阶段​​:

    • 写入binlog并刷盘

    • InnoDB将事务状态标记为COMMIT

​崩溃恢复时的处理​​:

  • 如果发现PREPARE状态的redo log:

    • 检查对应事务的binlog是否完整

    • 完整则提交,不完整则回滚

四、性能优化建议

  1. ​Redo log优化​​:

    • 适当增大innodb_log_file_size(通常设置为1-2小时写入量)

    • 考虑SSD存储redo log

  2. ​Binlog优化​​:

    • 生产环境建议使用ROW格式

    • sync_binlog=1保证安全性,=100或1000提升性能

  3. ​Undo log优化​​:

    • 独立undo表空间

    • 监控长事务避免undo膨胀

五、总结

MySQL通过redo log实现崩溃恢复,undo log实现事务回滚和MVCC,binlog实现主从复制和数据恢复。三种日志各司其职又相互配合,共同保证了MySQL的数据一致性和持久性。理解这些日志机制对于数据库性能调优和故障排查至关重要。

另外说明一下binlog的功能其实还很丰富,后面我还会单独写一篇,感兴趣的话大家可以关注一下!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值