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都会落盘。
0142020-03-22
相似问题