mysql学习笔记二:mysql的日志系统

mysql> create table T(ID int primary key, c int);
mysql> update T set c=c+1 where ID=2;

redo log与binlog区别

1.redo log 是 InnoDB 引擎特有的,提供了系统crash-safe恢复能力;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
2.redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
3.redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

执行流程:

1.执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。

2.执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据。

3.引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。

4.执行器生成这个操作的 binlog,并把 binlog 写入磁盘。

5.执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

update 语句的执行流程图,图中浅色框表示是在 InnoDB 内部执行的,深色框表示是在执行器中执行的。

image.png

两阶段提交

redo log 的写入拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"。

作用:为了让两份日志之间的逻辑一致

回滚段/undo log

每条记录在更新的时候都会同时记录一条回滚操作

当系统里没有比这个回滚日志更早的 read-view ,回滚日志会被删除

脏页

当更新操作,写了redo log更新了内存,还未写入到磁盘数据页,导致内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”

干净页

内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容