Redo Log

这个日志可以提高数据库的性能,是 InnoDB 引擎特有的日志,用于记录物理日志,比如数据页上做了什么修改,以及保存事务的提交过程;

该日志文件大小固定,文件写完就会从头开始覆盖,既然会覆盖,那就说明这个日志是不能用于回滚的;

若数据库重启,或者因为异常宕机重启后,Redo Log 可以保证之前提交的事务不会丢失,这种能力叫做 crash-safe

BinLog

这个日志是 MySQL Server 的日志,也就是说所有数据库引擎都可以使用这种日志,记录的是数据库的所有增删查改操作;

日志文件是追加模式写入的,并没有大小限制,不会覆盖之前的数据,可以用于恢复数据库中的数据;

如果数据库出现误删或者需要恢复数据库到某一时刻,那就需要该日志中的记录进行恢复;

日志写入过程

当一条数据库操作命令进入 MySQL Server 和存储引擎时,会执行以下几个操作(用更新命令进行解释):

1
2
3
UPDATE Table
SET field1 = value
WHERE field2 = value2
  1. 执行器会先去缓存中寻找符合条件的数据,如果缓存中没有找到,就去存储引擎中找数据;
  2. 存储引擎将数据返回给执行器,执行器更新操作得到一个新值,并调用引擎接口把数据发到存储引擎中;
  3. 引擎会将新数据记录到缓存中,并将操作写入 Redo Log,日志写入完成后,Redo Log 处于 prepare 预备状态,然后告知执行器写入数据完成,等待提交事务;
  4. 执行器将操作写入 BinLog 并落盘;
  5. 执行器调用引擎接口修改 Redo Log 状态为 commit 提交状态,数据更新完成;

MySQL-RedoLog-BinLog-日志写入