mysql更新时需要先从磁盘中查找记录,然后再将更新后的结果写进磁盘中。整个过程的IO、查找成本很高,因此采取了WAL技术来解决。
WAL:Write-Ahead Logging 先写日志,再写磁盘(在不忙的时候)
Redo Log
Redo log 是Innodb所特有的。
- 更新记录时,先写到Redo log中,在更新内存就可以返回成功了;
- innodb_flush_log_at_trx_commit:在适当的时候将Redo Log的内容更新到磁盘中
- Redo Log是固定大小的,循环写。
- 保证Innodb 有crash-safe的能力
问题1:同样是写磁盘,为什么Redo Log快?
Redo Log是顺序写的,而且可以通过组提交来提高效率
Bin log
binlog是mysql的server层实现的,一般用于备份和数据恢复
- binlog是追加写
- sync_binlog
两阶段提交
- 查找要更新的数据
- 在内存中更新数据
- 写入Redo log,Prepare状态
- 写binglog
- 提交事务,Redo Log处于 Commit状态
问题2:mysql写redo log,binlog是宕机时,是如何保证数据一致的
两阶段提交主要分为3个点:1 prepare阶段 2 写binlog 3 commit:
- 当在2之前宕机,重启恢复时:没有commoit,事务回滚;没有binlog,备份恢复也一致
- 当在3之前宕机,重启恢复时:prepare状态的redo log和binlog完整,自动commit;有binlog,备份恢复也一致。