02、InnoDB存储引擎下数据更新流程
2020-12-01 13:54:06 1 举报
InnoDB存储引擎下数据更新流程
作者其他创作
大纲/内容
解析SQL
SQL解析器
应用程序
8、准备提交事物记录binlog日志
值=1
定时刷新
os cache内存缓存
3、否从磁盘加载到Buffer Pool加独占锁
磁盘文件
InnoDB存储引擎
6、记录Redo日志记录对数据修改了什么
发送请求
连接
执行器
线程
10、刷磁盘
执行SQL语句
5、更新内存数据
获取SQL
用户
最优查询路径
判断刷新策略
7、准备提交事物把redo日志从内存刷到磁盘
后台线程
数据库连接池
一条更新语句的执行流程(例如对id=1这条数据修改)1:要更新一条语句,先去Buffer Pool缓冲池里看看有没有这条数据,如果没有,会从磁盘里加载到缓冲池里,然后对这行记录加独占锁2:把要更新行记录旧值写入undo日志,为了对事物进行回滚3:加锁、写入undo日志后,更新 Buffer Pool缓冲池里数据,此时这个数据是脏数据(因为缓存里是新值,磁盘里是旧值)4:为了避免数据库宕机,修改完内存数据后,必须要把对内存所做的修改写入到一个Redo Log Buffer里,记录你对数据做了什么修改(此时数据库宕机不会有任何问题,因为都是在内存里,但是此时事物是没提交的,没提交的话磁盘里的数据也没被修改,事物执行失败)5:当准备提交事物,根据一定策略把redo log buffer里刷到磁盘里。 a:通过InnoDB_flush_log_at_trx_commitl=1来配置,当值为1时(建议设置为1),提交事物前必须把redo log从内存刷入到磁盘。如果没刷到磁盘,事物就不会提交成功 b:当值为2时,把redo log写入os cache内存缓存里,实际没进入磁盘6:当准备提交事物,根据一定的策略把这次更新对应的binlog日志吸入到磁盘中 a:通过sync_binlog=0参数控制binlog的刷盘策略时,它不是直接进入磁盘,而是写入os cache b:当sync_binlog=1时,此时会强制在提交事物的时候,把binlog写入磁盘文件7:当binlog日志写入磁盘之后,就会完成最终的事物提交 a:此时会把本次更新对应的binlog文件名称和这次更新的binlog日志文件里的位置,写入到redo log日志文件里去 b:同时在redo log日志文件里写入一个Commit标记(用来保持redo log日志与binlog日志一致)8:后台IO线程随机将内存更新后的脏数据刷回磁盘,在IO线程把数据刷回磁盘前,宕机也没事,因为重启之后,会根据redo日志回复之前提交事物做过的修改到内存里去。之后某一时刻,还是会刷回磁盘
执行计划
查询优化器
SQL接口
9、写入binlog文件名与位置写入Commit标记
值=0
Redo log日志磁盘文件
4、把要更新旧值写入undo日志
值=2
binlog磁盘文件
1、调用接口执行更新语句
undo日志文件
SQL语句
MySQL数据库服务器
Redo logBuffer
Buffer Pool缓冲池(内存里)2.查询这条有没有
收藏
收藏
0 条评论
下一页