返回信息流redolog会有刷盘的位置标记 在缓存区里的是没持久化的
这是一条镜像帖。来源:北邮人论坛 / iwhisper / #7689938同步于 2024/10/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
IWhisper机器人发帖
为啥binlog不能用来故障恢复
IWhisper#241
2024/10/13镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
可以理解为,一个事务还没提交的时候redolog就一直刷盘(一阶段),然后事务commit的时候binlog才刷盘,然后redolog二阶段提交?<br>【 在 IWhisper#992 的大作中提到: 】<br><font class="f006">: 我也被问过这题,因为两阶段提交吧,binlog只有在事务提交时才会刷盘,redolog是不断刷盘的 </font>
并且另外就是 脏页刷盘跟更新redolog的lsn指针怎么保证原子性呢,中间宕机了lsn不就不正确了嘛?<br>【 在 IWhisper#81 的大作中提到: 】<br><font class="f006">: redolog会有刷盘的位置标记 在缓存区里的是没持久化的 </font>
难道不是因为binlog是逻辑日志吗?是依次全部执行,如果buffer poll刷了一半断电,执行全量的binlog会有问题吧,redo log更细,是针对本机具体哪个页写了什么?
Binlog(Binary Log)和 Redo Log 是数据库中的两种日志机制,虽然它们都记录数据库操作,但在设计目的和功能上有所不同。以下是解释为什么 **Binlog 不能用于数据恢复,而 Redo Log 可以** 的原因:<br><br>### 1. **设计目的不同**<br> - **Redo Log**: 主要用于**数据库的崩溃恢复**。Redo Log 记录的是数据变更前后的物理修改操作,帮助数据库在系统崩溃后,确保持久化数据与内存中已经提交的数据一致。这意味着即使数据库在操作过程中崩溃,Redo Log 也可以用来恢复到最新提交的状态。<br> - **Binlog**: 主要用于**数据备份、主从复制**和**审计**。Binlog 记录的是逻辑操作(如 `INSERT`, `UPDATE`, `DELETE`),但其并不是实时同步的,它往往是在事务提交后才记录。其主要用于恢复指定的时间点或用于搭建从库,而非崩溃恢复。<br><br>### 2. **写入时机不同**<br> - **Redo Log 写入时机**: Redo Log 是**WAL(Write-Ahead Logging)**机制的一部分。在事务提交前,数据库会先将 Redo Log 写入到磁盘,以确保即使在提交之前发生崩溃,也能通过 Redo Log 恢复数据。这样可以保证数据的一致性和持久性。<br> - **Binlog 写入时机**: Binlog 是在事务**提交完成后**才写入的,换句话说,Binlog 是在事务已经完全执行成功后才记录。这意味着如果数据库在事务提交过程中崩溃,Binlog 可能没有记录该事务。因此,Binlog 不适合用于崩溃后的数据恢复。<br><br>### 3. **恢复机制不同**<br> - **Redo Log 恢复**: Redo Log 是物理日志,它直接记录了页面的修改内容。数据库在崩溃重启后,可以通过 Redo Log 对内存和磁盘数据进行重放,将数据库恢复到崩溃前的最新一致状态。它可以帮助恢复未完成写入磁盘但已记录在 Redo Log 中的事务。<br> - **Binlog 恢复**: Binlog 记录的是逻辑操作,用于增量恢复或重做操作。在崩溃恢复中,Binlog 无法用来恢复数据,因为它没有足够的即时性,无法准确记录崩溃前未提交的事务。同时,Binlog 是在事务提交完成后才写入的,如果事务没有完成,则 Binlog 中没有记录,因此不能恢复未完成的操作。<br><br>### 4. **数据一致性保障**<br> - **Redo Log**: 在事务未提交时,Redo Log 会提前写入,保证即使在崩溃后,也能恢复到最新的提交状态,并且不会丢失已经提交的事务。<br> - **Binlog**: Binlog 是逻辑日志,不能像 Redo Log 一样用来确保事务的一致性。在崩溃情况下,如果 Binlog 没有记录完整的事务操作,数据恢复可能会出现不一致。<br><br>### 5. **刷盘策略**<br> 虽然 Binlog 和 Redo Log 的刷盘策略可以自定义(如异步刷盘或同步刷盘),但这并不改变两者在数据恢复场景中的核心区别。Redo Log 主要保证在事务提交前即写入日志,而 Binlog 是在事务完全提交后才写入,因此 Binlog 即使刷盘也不能作为崩溃恢复的依据。<br><br>### 总结<br>- **Redo Log** 是用于数据库崩溃后的恢复机制,通过物理日志确保系统崩溃后能恢复到最新的提交状态。<br>- **Binlog** 主要用于主从复制和备份,它不能实时记录未提交的事务,因此不适合用于崩溃后的数据恢复。<br>【 在 IWhisper#241 的大作中提到: 】<br><font class="f006">: 看网上说binlog不能标识哪些是已经刷盘的哪些是丢掉的,那redolog是咋区分呢?没搞懂 </font>