redo log的原子性问题

来源:2-13 MySQL常用存储引擎之Innodb

烈焰卡卡

2020-03-13

老师好,我想问一下

第一个问题,redo log作为commit后先刷新到磁盘的日志,它的写入是如何保证原子性的?

我从网上看到,说redo是按block写的,与磁盘扇区一致都是512字节,目的是保证redo的原子性。那么请问,这个怎么理解。我一个事务里,可能执行了n个写操作,那么redo是将我的所有操作写在1个block的日志里,还是写n个block。如果是n个的话,刷新磁盘的动作我理解也不保证是原子操作了。

第二个问题,二进制日志是先于redo被记录到磁盘的,那么假如我先commit后,二进制日志刷新到磁盘,此时宕机。那么重启后,由于没有redo文件,数据没有被恢复,但是二进制日志已经记录了,这时候从服务器会不会就由于同步了二进制日志而造成数据不一致?

写回答

1回答

sqlercn

2020-03-13

第一个问题,首先要明确一点redo是在事务的进行过程中持续写到redo 缓存中的。当事务提交时redo会从缓存中刷新到磁盘redo log.这里redo 缓存和redo log的基础存储单元都是512字节的块,可以认为基本上是顺序的写操作,所以性能很快,如果这时出错,事务提交就会出错,事务修改的数据会通过undo 日志进行恢复。

第二个问题。mysql 日志的二次提交,是先刷新redo log 后 再刷新 binlog 最后才是在存储引擎层commit事务,所以只要binlog落盘了,redo log都会落盘。

0
14
sqlercn
回复
烈焰卡卡
是的,差不多就是这样。
2020-03-22
共14条回复

MySQL提升课程 全面讲解MySQL架构设计

面面俱到讲解影响MySQL性能的各个因素,让MySQL架构了然于胸。

4419 学习 · 547 问题

查看课程