再言,大家一定要用md记笔记,他他他实在是太好用了!
日志系统
-
1.查询语句的流程更新语句等同样会走一遍
-
2.与查询不同,更新流程涉及到redo log(重做日志),和binlog(归档日志)。
1.重做日志 redo log(引擎层特有
-
1.WAL技术:全称为WriteAhead Logging,流程是日志>>磁盘
-
2.有记录需要更新,lnnoDB先把记录写到redo log,并更新内存。
lonnDB引擎适当时,会将操作记录更新到磁盘内,更新会在系统空闲时候 -
3.redo log大小固定,可以配置组文件,从头写到尾,从尾再到头,若四个组如图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fz4q2e7S-1640873546313)(https://note.youdao.com/yws/res/f/WEBRESOURCE8e461219dd21288ed4d9d60fdaf6497f)] -
4.write pos记录当前位置,写到3末尾回到0
checkpoint是当前在’去除’的位置,将记录更新到数据文件
空着的部分,可以记录新的操作,若去除操作追上写的操作,不再执行去除操作,推进写的操作。 -
[] 5.redo log的存在可以lnnoDB保证即使数据库发生异常重启 ,之前提交的数据也不会丢失,这个能力被称为crash-safe
2.redo log 与 binlog(servier层特有)的区别
-
[] 1.binlog是server层特有所有引擎都可以使用,redo log是lnnoDB引擎特有的
-
[] 2.redo log是物理日志 ,binlog是逻辑日志,如 ID=1的行a字段加1
-
[] 3.redo log是循环的,空间会用完
binlog是追加写入的,写到一定大小到下一个,不会覆盖以前的日志
3.InnoDb引擎执行增删语句内部流程
-
1.执行器找到特定行。引擎用树搜索选中某一行如(id==2的行),如果该行所在的数据存在内存,则返回执行器,否则从磁盘读入内存,再次返回
-
2.执行器拿到引擎给的行数据,若某个字段加1,则实际是一行新的数据,在调用引擎写入新数据
-
3.引擎将新数据更新到内存,同时操作记录到redo log,此时redo log处于准备状态(prepare),告知执行器执行完毕,随时准备提交事务
-
4.执行器生成该操作的binlog,将binlog写入磁盘
-
5.执行器调用引擎的提交事务接口,将写入的redo log改成提交状态(commit),更新完成。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WqCjpDiY-1640873546315)(https://note.youdao.com/yws/res/a/WEBRESOURCE0a8416549cdd913b912b5d0713146a5a)]