mysql实战45讲学习笔记--02

2.日志系统:一条sql更新语句是如何执行的

一条查询语句执行过程是经过连接器,分析器,优化器,执行器等功能模块最后到达存储引擎
mysql实战45讲学习笔记--02_第1张图片

查询语句的流程,更新语句也是会同样走一遍。

更新流程还涉及两个重要的日志系统,redo log(重做日志)和binlog(归档日志)。

重要的日志模块:redo log
Mysql里常说的WAL技术(Write-Ahead Logging),关键点在先写日志,再写磁盘;
具体来说,就是一条记录需要跟新的时候,InnoDB引擎会先把记录写到redo log里面,并更新内存,这时更新就算完成了,同时,InnoDB引擎会在适当的时候,将操作记录更新到磁盘里面。而这个更新是在系统比较空闲的时候做,
InnoDB的 redo log 是固定大小的,记录满了就循环。
mysql实战45讲学习笔记--02_第2张图片

Writepos是当前记录的位置,一边写一边后移,写到第三号文件末尾后就又回到0号文件开头,checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录权要把记录更新到数据文件。
Write pos 和checkpoint之间空着的部分可以用来记录新的操作,如果write pos 追上checkpoint ,这时候不能执行新的更新,得擦掉一些记录,
Redo log ,InnoDB就可以保证数据库发生异常重启,之前提交的记录也不会丢失,这个能力称为crash-safe(赊账记录在黑板生,停业几天还是可以看见这些记录)

重要的日志模块,binlog
MySQL整体来看两层,Server层主要做的是mysql功能层面的事,引擎层主要负责存储相关的具体事宜。Redo log是InnoDB 引擎特有的日志,而Server层也有自己的日志,称为binlog(归档日志)

Binlog和redo log之间的不同
1.redo log 是InnoDB特有的,binlog是mysql中server层实现,所有引擎都可以使用
2.Redo log是物理日志,记录的是“在某个数据页上做了什么操作”binlog是逻辑日志,记录的是这个语句的原始逻辑
3.Redo log实训管写的,空间固定会用完,binlog是可以追加写入的,”追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前日志。

Update的执行流程图,浅色框表示是在InnoDB内部执行的,深色框表示实在执行器中执行的
mysql实战45讲学习笔记--02_第3张图片

Redo log写入拆成两个步骤,prepare和commit。这就是两阶段提交

两阶段提交
为了让两份日志之间的逻辑一致,这样才可以让数据库恢复到半个月内任意一秒的状态。
Redo log和binlog都可以用来表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。

Redo log 用于保证crash-safe能力,innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log 都直接持久化到磁盘。这样可以保证mysql异常重启后数据不丢失
Sync_binlog 这个参数设置成1的时候,表示每次事务的binlog都持久化到磁盘,这样可以保证mysql异常重启购binlog不丢失。

问题

你可能感兴趣的:(学习笔记)