简单来说:
假设我们现在要做一个更新操作:update users set name='xxx' where id=10
首先这个sql肯定会经过sql接口、解析器、优化器、执行器几个环节,解析sql语句,生成执行计划,接着由执行器负责计划的执行,最后调用存储引擎的接口去执行。
一、重做日志(redo log)
更新的时候,首先是会对缓冲池(Buffer Pool)也就是存在在内存里的数据进行修改,此时磁盘的数据还没来得及修改,万一此时宕机,会导致内存修改后的数据丢失,此时就需要将内存所做的修改写入到rudo log buffer里去用来恢复数据。确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
二、回滚日志(undo log)
如果我们执行的更新语句是在事务中,在事务提交之前都是可以对数据进行回滚的,因此undo log中记录了更新前的值,'zhangsan'和id=10这些信息都会记录在undo log里。
保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读
三、二进制日志(binlog)
用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。
用于数据库的基于时间点的还原。