请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

redo log的原子性问题

老师好,我想问一下

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

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

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

正在回答 回答被采纳积分+3

1回答

sqlercn 2020-03-13 14:46:45

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 烈焰卡卡 #1
    第一个问题,我可以理解成,redo在写完之后会标记该事务Redo落盘完成么?在redo写磁盘的过程中崩溃,即使redo中记录了一半事务,在恢复数据时,mysql也是可以判断出,redo不完整从而按照undo来恢复,是这意思么?
    回复 有任何疑惑可以回复我~ 2020-03-13 14:58:13
  • sqlercn 回复 提问者 烈焰卡卡 #2
    可以这么认为。
    回复 有任何疑惑可以回复我~ 2020-03-13 21:02:25
  • 提问者 烈焰卡卡 回复 sqlercn #3
    我又想到了一个问题……就是redo是在事务过程中持续写到缓存的对吧,假如,线程1做写操作,涉及到改编B+树结构修改了某2个数据页中的内容,redo写入缓存,此时线程2也做写操作,同样涉及到修改这2个数据页中的数据,在写redo缓存时是否能发现有线程在同时修改相同数据也的情况?发现与否线程2都会如何处理,因为线程1的事务不一定就会commit
    回复 有任何疑惑可以回复我~ 2020-03-14 21:40:15
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信