redo log与binlog的区别
redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
更新语句的执行流程
通过一个更新语句的流程,分析日志系统。
mysql>update T set c=c+1 where ID=2;
「执行流程:」
首先连接器连接数据库
分析器通过词法,语法分析发现这是一条更新语句
优化器决定使用ID这个索引
执行器找引擎取ID=2的这行数据。ID是主键,引擎用索引找到这一行,如果这一行数据本来就在内存中,直接返回给执行器,否则需要从磁盘读入内存。
执行器拿到数据后。把这个数据的
c+1
,得到一行新的数据,再调用引擎接口写入这行新数据。引擎将这个数据更新到内存中,同时将这个更新操作记录在
redo log
, 此时redo log 处于prepare(准备)状态
,告知执行器执行完成了,可以随时提交事务。执行器生成这个操作的
binlog
,并将binlog写入磁盘。执行器调用存储引擎的提交事务接口,引擎把刚刚写入的redo log改成
commit(提交)
状态,更新完成。
图中浅色框表示是在InnoDB内部执行的
,深色框表示是在执行器中执行的
。