redo log和bin log以及两阶段提交(笔记)

本文详细介绍了MySQL中redo log和bin log的作用、区别,以及两阶段提交的原因。redo log用于实现InnoDB引擎的crash-safe能力,而bin log则用于数据恢复。文章还建议开启bin log,设置sync_binlog为1以确保bin log不丢失,并调整innodb_flush_log_at_trx_commit为1保证数据不丢失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.redo log

如果熟悉MySQL你肯定知道MySQL能过对数据进行恢复(前提是开启bin log日志),当然这要归功于bin
log日志。但是你可曾听过redo log呢?

首先redo log是innodb引擎特有的,需要注意的是innodb是MySQL的一个插件。

什么是redo log呢?有啥用?实际上当我们执行一条修改语句,难道每次都要落盘吗?显然是不可能的,如果每次都需要落盘,首先数据量大的时候每次都要去对这么大的文件进行io操作,显然在效率上是不可行的。

那么redo log是怎么操作的呢?redo log首先是一个环形的文件,可以设置每个文件大小,同时是循环写入的,当对数据进行修改后会先写入到redo log,如果开启了binlog那么会再写入到bin log,最后根据实际情况来写入磁盘。这样就算MySQL异常重启了也能够保证数据不丢失,这种功能称之为crash-safe能力。

究竟什么时候写入到磁盘?

写入磁盘的实际是由MySQL决定的,例如现在不忙了。或者现在redo log要写满了。此时MySQL会主动进行触发写入到磁盘。

如下所示,write pos是当前写入的位置,而check point则是redo log落盘后对redo log进行清理后的位置。可以看出write pos和che

### redologbinlogMySQL阶段提交机制中的作用 #### Redo Log 的角色 Redo log 主要用于崩溃恢复,确保数据不会因服务器突然宕机而丢失。当事务执行过程中发生任何更改时,这些更改会先写入 redo log 中,在此之后才会真正应用到磁盘上的表空间文件里。这种方式可以极大提高性能并保障持久性[^1]。 ```sql -- 插入一条记录作为例子展示如何触发redo log的写入 INSERT INTO T (ID, c) VALUES (2, 0); ``` #### Binlog的角色 Binlog 记录了所有的 DDL DML 操作(除了某些特定命令),它主要用于复制功能以及灾难后的点恢复。每当有一个更新语句被执行时,该语句会被追加到当前活跃的日志文件中形成一系列事件流。对于上述提到的例子而言: ```sql UPDATE T SET c = c + 1 WHERE ID = 2; ``` 这条 SQL 将被转化为相应的 Query Event 或 Row Event 并保存至 binlog 文件内[^3]。 #### 者间的交互——阶段提交协议 为了保持这种日志之间的一致性,MySQL 实现了一个称为 "two-phase commit protocol" 的流程。具体来说就是在准备阶段将所有必要的信息都准备好;而在第二步即提交阶段,则正式完成整个过程。这意味着只有当 redo log 已经成功确认后,才会继续向 binlog 进行写入操作[^2]。 #### 关键差异总结 | 特征 | Redo Log | Binlog | | --- | --- | --- | | **用途** | 数据库内部使用的物理日志,支持快速恢复 | 用户级逻辑日志,适用于主从同步基于时间点的数据恢复 | | **粒度** | 行级别变更描述 | SQL 语句或行级别的变化 | | **存储位置** | InnoDB 存储引擎层 | MySQL Server 层 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值