MySQL日志系统:redo log与binlog
日志系统主要有redo log(重做日志)和binlog(归档日志)。redo log是innodb存储引擎层的日志,binlog是mysql server层记录的日志, 两者都是记录了某些操作的日志(不是所有)自然有些重复(但两者记录的格式不同)。
图来自极客时间的mysql实践,该图是描述的是mysql的逻辑架构。
redo log日志模块
redo log是innodb存储引擎层的日志,又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。在实例和介质失败(media failure)时,redo log文件就能派上用场,如数据库掉电,innodb存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。
在一条更新语句进行执行的时候,innodb引擎会把更新记录写到redo log日志中,然后更新内存,此时算是语句执行完了,然后在空闲的时候或者是按照设定的更新策略将redo log中的内容更新到磁盘中,这里涉及到wal
即write ahead logging
技术,他的关键点是先写日志,再写磁盘。
有了redo log日志,那么在数据库进行异常重启的时候,可以根据redo log日志进行恢复,也就达到了crash-safe
。
redo log日志的大小是固定的,即记录满了以后就从头循环写。
图片来自极客时间,该图展示了一组4个文件的redo log日志,checkpoint之前表示擦除完了的,即可以进行写的,擦除之前会更新到磁盘中,write pos是指写的位置,当write pos和checkpoint相遇的时候表明redo log已经满了,这个时候数据库停止进行数据库更新语句的执行,转而进行redo log日志同步到磁盘中。
binlog日志模块
binlog是属于mysql server层面的,又称为归档日志,属于逻辑日志,是以二进制的形式记录的是这个语句的原始逻辑,依靠binlog是没有crash-safe
能力的
redo log和binlog区别
redo log是属于innodb层面,binlog属于mysql server层面的,这样在数据库用别的存储引擎时可以达到一致性的要求。
redo log是物理日志,记录该数据页更新的内容;binlog是逻辑日志,记录的是这个更新语句的原始逻辑
redo log是循环写,日志空间大小固定;binlog是追加写,是指一份写到一定大小的时候会更换下一个文件,不会覆盖。
binlog可以作为恢复数据使用,主从复制搭建,redo log作为异常宕机或者介质故障后的数据恢复使用。
一条更新语句执行的顺序
update t set c=c+1 where id=2;
执行器先找引擎取 id=2 这一行。id 是主键,引擎直接用树搜索找到这一行。如果 id=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 n,现在就是 n+1,得到新的一行数据,再调用引擎接口写入这行新数据。
引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。
这个update语句的执行流程图,图中浅色框表示是在 innodb 内部执行的,深色框表示是在执行器中执行的。
图片来自极客时间.
上一篇: 一篇文章带你入门java模板模式
推荐阅读
-
MySQL 日志系统之 redo log 和 binlog
-
MySQL的日志(二):事务日志(redo log和undo log)
-
MySQL5.7慢查询日志时间与系统时间差8小时原因详解
-
MySQL主库binlog(master-log)与从库relay-log关系代码详解
-
mysql 开发进阶篇系列 19 MySQL Server(innodb_flush_log_at_trx_commit与sync_binlog)
-
数据库——MySQL日志(redo log、undo log、bin log、erro log、slow query log、general log)
-
mysql 事务日志 redo log和undo log
-
【MySQL】之 binlog、undo log 和 redo log 详解
-
MySQL原理解读——redo log、undo log和binlog
-
【mysql】-- Mysql的undo log、redo log、bin log日志