面试官问我redo log如何实现Mysql持久性

如果你觉得符合逻辑,那便也许是对的

回顾持久性

  持久性是指事务一旦提交,它对数据库的改变就应该是永久性的,接下来的其他操作或故障不应该对本次事务的修改有任何影响。

redo log

  redo log包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重做日志文件(redo log file),该部分日志是持久的并且是物理日志并且顺序存储

在这里插入图片描述
  在redo log buffer或者redo log file on disk中,由很多log block组成,大家姑且先认为每个log block记录一块数据页(InnoDB引擎数据页)的修改,其实会有溢出情况内用LOG_BLOCK_FIRST_REC_GROUP来使用后一个log block记录溢出部分。

重要的参数

  MySQL支持用户自定义在commit时如何将log buffer中的日志刷log file中。这种控制通过变量 innodb_flush_log_at_trx_commit 的值来决定。该变量有3种值:0、1、2,默认为1。但注意,这个变量只是控制commit动作是否刷新log buffer到磁盘。

在这里插入图片描述
0和2的区别:0在mysql宕机后会最多丢失1秒的数据,2是操作系统宕机后最多丢失1秒的数据。
  赘述一下因为每次提交OS Buffer就算没调用fsync,操作系统也会在适当的时机刷盘。

回到redo log如何实现持久性的问题

  redo log在数据准备修改前写入缓存中的redo log中,然后才对缓存中的数据执行修改操作;而且保证在发出事务提交指令时,先向缓存中的redo log写入日志,写入完成后才执行提交动作。

redo log file写入就是安全的吗

  由于重做日志块的大小和磁盘扇区大小一样,都是512字节,因此重做日志的写入可以保证原子性,不需要doublewrite技术。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值