极客时间MySQL实战45讲的第二讲,从一条update语句为引,讲MySQL的日志模块。update操作,除了和查询语句一样经过连接器、分析器、优化器、执行器等步骤外,还涉及到日志。以便在遇到宕机或者其他意外时,得以将数据恢复过来;
MySQL的日志模块,主要分为redo log(重做日志)和bin log(归档日志);redo log 是由Inno DB提供的,它保证了数据库在异常重启之后,之前提交的记录不丢失,称为 crash - safe。而bin log则存在于server层;
redo log和bin log主要不同点在于:
- redo log是Inn DB引擎特有的;bin log是MySQL的Server层实现的,所有引擎都可以使用。
- redo log是物理日志,记录的是“在某个数据页上做了什么修改”;bin log是逻辑日志,记录的是这
个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。- redo log是循环写的,空间固定会用完;bin og是可以追加写入的。“追加写”是指bin log文件写到一
定大小后会切换到下一个,并不会覆盖以前的日志。
其中,redo log是固定大小的,分组分块,如图所示,有一个check point和write pos,write point记录当前位置,新纪录追加在此,而check point则是要擦除的位置,当write pos追上check point,说明该空间写满了,需要将数据写入磁盘才能继续使用redo log,这和数据结构中的环形链表十分相像;同时,为了保证redo log和bin log保持一致,redo log的写入分了两个步骤,分成了两次commit;
bin log则是没有限制大小,采用的是追加的方式,不会覆盖掉之前的日志;
附件为该文章的文档
链接:https://pan.baidu.com/s/1NpBDmDxfu6U1jD7zR4TPgw
提取码:6ga0