MySQL之Update生命周期最详细的解剖
Server 层阶段
1.1 连接器
客户端发起一个 TCP 请求后,MySQL Server 端会负责通信协议处理、线程处理、账号认证、安全检查。
1.2 分析器
MySQL Server 端对一个 SQL 请求进行词法分析(识别 select、from),然后会对语法 进行分析判断语法是否正确。
1.3 优化器
优化器会分析 SQL 语句,选择合适的索引,根据预结果集判断是否使用全表扫描。
1.4 执行器
InnoDB 引擎层阶段
也就是上面的执行器阶段
1.4.1 事务执行阶段
1) 请求进入 InnoDB 引擎后,首先判断该事务涉及到的数据页是否在 BP 中,不存在则会从磁盘中加载此事务涉及的数据页到 BP 缓冲池中,并对相应的索引数据页加锁
思考:
数据是如何从磁盘加载到 BP 中的?
BP 中的新老生代是如何交替及回收?
如何对相应数据加?
解答:
2) 将修改前的数据写入到 Undo 中,修改后将回滚针执行 Undo log 中修改前的行
思考:
为什么要写Undo 日志?
Undo 的存储方式是什么?
解答:
3)写 redo log buffer 在 BP 中对数据进行修改操作,并将修改后的值写入到 redo log buffer 中等待异步 sync到磁盘
思考:
什么时候写入 redo log buffer?
commit 后 log buffer 如何落盘到 redo log?
日志刷盘规则是什么?
解答:
4)写 binlog cache
同时将修改的信息按照 event 格式记录到 binlog_cache 中,等待落盘。如果 binlog cache 不够用时,会写入到 binlog 临时文件。
思考:
事务 binlog event 的写入流程是什么?
解答:
5)写 change buffer
如果这个事务需要在二级索引上做修改,写入到 change buffer page 中,等待之后,事务需要读取该二级索引时进行 merge。
思考:
什么时候会用到 change buffer?
为什么仅适用于普通索引页?
哪些场景会触发刷新 change buffer?
什么业务不适合/适合开启 change buffer?
change buffer 相关参数有哪些?
解答:
1.4.2 事务提交阶段
打开 binlog 选项之后,执行事务提交会进入二阶段提交模式(prepare 阶段和 commit 阶段。两阶段涉及两个参数(sync_binlog和innodb_flush_log_at_trx_commit)。
1)事务提交分为 prepare 阶段与 commit 阶段(两阶段提交)事务的 commit 操作在存储引擎和 server 层采用内部 XA。
两阶段提交协议保证事务的一致性,主要保证 redo log 和 binlog 的原子性。
2)Redo log prepare
写入 redo log 处于 prepare 阶段,并且写入事务的 xid。将redo log buffer刷新到redo log磁盘文件中,用于崩溃恢复。刷盘的方式由innodb_flush_log_at_trx_commit 决定。
3)Binlog write&fync: 执行器把 binlog cache 里的完整事务和 redo log prepare 中的 xid 写入到 binlog 中
Dump 线程会从 binlog cache 里把 event 主动发送给 slave 的 I/O 线程,同时执行 fsync 刷盘(大事务的话比 较耗时)并清空 binlog cache。
Binlog 刷盘的方式由 sync_binlog 决定。binlog 写入完成,事务就算成功。
总结:
事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写入到 binlog file 中。当 sync_binlog 为 1 时,binlog 落盘后才会通知 dump thread 进行主从复制
4)Redo log commit commit
提交阶段中,该事务产生的 redo log 已经 sync 到磁盘中,在 redo log 里标记 commit,说明事务提交成功。
5)事务提交,释放行记录持有的排它锁
6)Binlog 和 redo log 落盘后触发刷新脏页操作
先把该脏页复制到 doublewrite buffer 里,再把 dobulewrite buffer 里的数据,刷新到共享表空间(ibdata),然后脏页刷新到磁盘中,此时内存页和数据页一致。
思考:BP 中的脏页刷盘机制是什么?
解答:当 InnoDB 中脏页比例超过 innodh_max_dirty_pages_pct_lwm 的值时,开始刷盘。
1.4.3 假设事务 ROLLBACK
因为系统异常或显示回滚,所有数据变更会变成原来的,通过回滚日志中数据进行恢复。对于 in-place(原地)更新,将数据回滚到最老版本。
对于 delete+insert 方式,标记删除的记录清理删除标记,同时把插入的聚集索引和二级索引记录也会删除。
文章内容来源地址:https://mp.weixin.qq.com/s/2NA2zzhL3TRKCkx9s91PJA