极客--日志系统:一条SQL更新语句是如何执行的?
前篇我们知道,一个查询语句的执行流程,并介绍执行过程中涉及的模块,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎
一条更新语句的执行流程
update T set c = c + 1 where ID = 2
-
首先连接器的工作,TCP三次握手,账号密码校验,权限校验
-
Mysql8.0已经取消缓存,在一个表更新的时候,查询缓存失效
-
分析器通过词法和语法解析这是一条更新语句,优化器决定要使用ID这个索引,然后执行器负责具体执行,找到这一行,然后更新。
-
更新流程涉及两个重要的模块,redo log与binlog
redo log
-
如果每一次更新都会写入磁盘,然后磁盘也要找到对应那条记录,然后再更新,整个过程的IO成本,查找成本很高
-
Mysql中WAL技术,关键点就是先写日志,再写磁盘
binlog
从mysql整体上看分为Server层与引擎层,redolog是Innodb特有的日志,而Server层特有的日志就是binlog
这两种日志有以下三点不同。
- redo log 是 InnoDB 引擎特有的;
- binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
- redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;
- binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
- redo log 是循环写的,空间固定会用完;
- binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
两阶段提交
-
binlog 会记录所有的逻辑操作,并且是采用“追加写”的形式。如果你的 DBA 承诺说半个月内可以恢复,那么备份系统中一定会保存最近半个月的所有 binlog,同时系统会定期做整库备份。这里的“定期”取决于系统的重要性,可以是一天一备,也可以是一周一备。
-
如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。
-
redo log保证crash-safe能力。innodb_flush_Log_at_trx_commit设置为1的时候,表示每次事务redo log都持久化到磁盘。这个参数建议设置为1,这样保证Mysql异常重启之后数据不丢失
-
sync_binlog这个参数设置为1的时候,表示每次事务Binlog都持久化到磁盘,这个参数也建议设置为1,这样保证Mysql异常重启以后binlog不丢失
-
redo log记录的是磁盘上数据的物理变化,binlog记录当时执行高级编程语言
-
Binlog有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。
作者:dodogod
出处:https://www.cnblogs.com/dodogod/p/16698095.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
备注:你可以在这里自定义其他内容,支持 HTML
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!