几年了,作为一个码农终于把MySQL日记看懂了( 二 )
六、认识事务日记 (Redo log)6.1 Redo log 概念Redo log 是重做日记 , 属于InnoDB引擎的日记 。 是物理日记 , 日记记录的内容的是数据页的更改 , 这个页 “做了什么改动” 。 如:add xx记录 to Page1 , 向数据页Page1增加一个记录 。文章插图
6.2 Redo log 作用
- 前滚操作:具备crash-safe能力 , 提供断电重启时解决事务丢失数据问题 。
- 提高性能:先写Redo log记录更新 。 当等到有空闲线程、内存不足、Redo log满了时 “刷脏” 。 写Redo log是顺序写入 , 刷脏是随机写 , 节省的是随机写磁盘的 IO 消耗(转成顺序写) , 所以性能得到提升 。 此技术称为WAL技术:Write-Ahead Logging , 它的关键点就是先写日记磁盘 , 再写数据磁盘 。
6.4 Redo log 容灾恢复过程MySQL的处理过程如下
- 判断redo log是否完整 , 如果判断是完整(commit)的 , 直接用Redo log恢复
- 如果redo log只是预提交prepare但不是commit状态 , 这个时候就会去判断binlog是否完整 , 如果完整就提交Redo log , 用Redo log恢复 , 不完整就回滚事务 , 丢弃数据 。
6.5 Redo log 刷盘时机Undo log的刷盘时机和Redo log差不多 , 但是对于Undo log我没找到对应的刷盘参数设计 , 所以不再提 。 Redo log每次先写入Redo Log Buffer中 , 然后通过刷盘时机控制刷入OS Buffer时间和刷入日记磁盘的时间 。
![几年了,作为一个码农终于把MySQL日记看懂了](http://res.youth.cn/img-detail/f395883f28f206f7a8d8a7cafb1669aa:640:421.jpg)
图3:内存和磁盘日记结构图
在Undo Log中 , MySQL是通过参数innodb_flush_log_at_trx_commit来控制刷盘时机 , 取值是0、1和2三种值 。 0表示事务提交后 , 每秒写入OS Buffer并调用fsync()写入日记磁盘中;1表示每次事务提交会写入OS Buffer并调用fsync()将日记写入日记磁盘中 。 2表示事务每次提交写入到OS Buffer , 每秒调用fsync()写入日记磁盘 。 可见参数为1是最安全的 , 同时也是默认值 。
![几年了,作为一个码农终于把MySQL日记看懂了](http://res.youth.cn/img-detail/51661f7f018961ae9eacc63be1ee7a63:640:342.jpg)
图4:Redo log刷盘时机参数对应操作图
6.6 Redo log 存储方式
![几年了,作为一个码农终于把MySQL日记看懂了](http://res.youth.cn/img-detail/f63825373f4642e6964de3be8c3f6bbd:448:346.jpg)
图5:Redo log File环形存储结构图
上图是日记磁盘的Redo log环形设计图(从头写 , 写到结束又从头开始写~循环) 。 write pos和check point是两个指针 , write pos指针指向当前日记文件写入的位置 , check point指针指向当前要擦除的开始位置 。 图中绿色部分是可以写入Redo log地方 , 每次写入 , write pos指针会顺时针推进 , 当然基本不会与check point指针重合 , 因为MySQL有这种机制去实现 , 每次触发检查点checkpoint , check point会指针向前推进 , 这个过程就是需要进行刷日记和数据磁盘 , 记录相应的LSN , 引出难点LSN 。
6.7 Redo Log 检查点啥时候会触发检查点checkpoint , 网上找了点资料:啥时候数据库会触发检查点checkpoint
![几年了,作为一个码农终于把MySQL日记看懂了](http://res.youth.cn/img-detail/dc782019b9bf607c4d64f136237581d8:851:140.jpg)
【几年了,作为一个码农终于把MySQL日记看懂了】图6:检查点触发时机
Checkpoint发生的时间、条件及脏页的选择等都非常复杂 。 而Checkpoint所做的事情无外乎是将缓冲池中的脏页刷回到磁盘 , 不同之处在于每次刷新多少页到磁盘 , 每次从哪里取脏页 , 以及什么时间触发Checkpoint 。 这些本文不会去研究 。
6.8 Redo Log LSNLSN这个概念 , 比较复杂 , 我介绍完你们不一定懂!LSN称为日志的逻辑序列号(log sequence number) , 在innodb存储引擎中 , lsn占用8个字节 。 LSN的值会随着日志的写入而逐渐增大 。 可以简单理解SLN就是记录从开始到现在已经产生了多少字节的Redo log值 。
存储方式两个指针又是通过LSN计算得到指向位置 , 因为LSN记录的是文件的大小字节 , 当超过文件大小时 , 需要用取模计算出这两个指针位置 , 取模使得写入就会从头开始写 , 这样使得两个指针在一个文件中 , 一直落在循环位置 , 你追我赶的过程 。 这就是Redo log 环形逻辑思想设计实现 。
- 纠结|硬杠红米Note9Pro?iQOO Z1跌至1575,对比之后纠结了!
- 手机基带|为了5G降低4G网速?中国移动回应来了:罪魁祸首不是运营商
- 车企|华为不造车!但任正非加了一个有效期,3年
- 峰会|这场峰会厉害了!政府企业专家媒体共议网络内容生态治理
- 培育|跨境电商人才如何培育,长沙有“谱”了
- 先别|用了周冬雨的照片,我会成为下一个被告?自媒体创作者先别自乱阵脚
- 巅峰|realme巅峰之作:120Hz+陶瓷机身+5000mAh 做到了颜值与性能并存
- 不负众望|12小时卖了30万部!Redmi Note9不负众望,卢伟冰开心了?
- 蛋壳公寓|官媒发声:绝不能让“割韭菜者”一跑了之!
- 看过明年的iPhone之后,现在下手的都哭了