mysql日志系统

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,备份恢复也一致。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容