一条语句在MySql中的执行流程是这样的:MysqlSql客户端通过Tcp连接向MySql服务器发起请求,MySql Server依次经过连接器、分析器、优化器、执行器,然后根据需求读写存储引擎,譬如InnoDB。 如下图所示:
image.png
现在InnoDB引擎的流行与其支持的事务特性密不可分。要想crash-safe就离不开redo log和binlog的紧密配合。
binlog是MySql server层的日志,用来归档的。MySQL的主从同步就是基于binlog的。让MySql从众多RDB中脱颖而出,与MySQL原生支持主从同步密不可分。
redo log是InnoDB引擎特有的。用来实现 crash-safe。
一个update操作,譬如 update log set password='CimageView2' where id =1
,在日志系统中是这样流转的:
- MySql Server层的执行器调用InnoDB引擎的写接口,传入此次变更。
- InnoDB引擎在写入redo log后,更新内存。此时redo log中将这条变更标记为preare状态。这个时候,更新操作就算是完成了。InnoDB引擎会在合适的时机将这个更新操作更新到磁盘。
- 执行器收到InnoDB引擎的成功回复,知道更新已经成功,在任何时间提交事务,更新操作的全部成功了
- 执行器将这条变更的原始语句写入binlog。
- 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
- 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。
binlog和redo log:
区别1:
redo log 是 InnoDB 引擎特有的;
binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
区别2:记录数据格式上
redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;
binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 id=1这一行的 password 字段更改为CimageView2”。
区别3:写入方式上
redo log 是循环写的,空间固定会用完;
binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
网友评论