一、binlog和redo log的区别
特性 | binlog | redo log |
---|
记录对象 | 记录的是 MySQL 服务器的事务操作,针对的是整个数据库实例。 | 记录的是 InnoDB 存储引擎的数据页变化,针对的是具体的存储引擎层面。 |
记录内容 | 记录的是事务的逻辑操作,例如 SQL 语句(语句型 binlog)或行变化(行型 binlog)。 | 记录的是数据页的物理变化,例如某个页的某个偏移量的修改。 |
记录时间 | 在事务提交后写入(即事务提交完成后才写入 binlog)。 | 在事务执行过程中写入(即事务提交前会写入 redo log)。 |
记录方式 | 写到一定大小会切换下一个,不会覆盖之前的日志。 | 依次往几个Redo log文件中写入,如果最后一个文件写满了,又会回到第一个Redo log中写入。 |
用途 | 备份,复制 | 保证事务的持久性 |
二、Redo log和undo log的区别
对比方向 | undo log | redo log |
---|
记录内容 | 方向的数据修改记录 | 正向的数据页变更记录 |
写入顺序 | 随机读写 | 顺序写 |
作用 | 帮助事务回滚以及实现MVCC | 用保证事务的持久性 |
三、更新数据时,各种日志的写入时机
举例:DELETE FROM t1 WHERE id=1
阶段 | undo log | redo log | binlog |
---|
事务开始 | 开始记录事务的旧值,但尚未写入。 | 未写入。 | 未写入。 |
事务执行阶段 | 写入 undo log,记录 id=1 行的旧值。 | 未写入。 | 未写入。 |
事务提交判断 | undo log 已写入,记录旧值。 | 未写入。 | 未写入。 |
事务提交 | undo log 已写入,记录旧值。 | 写入 redo log,记录 id=1 行被删除后的物理变化。 | 未写入(binlog 在事务提交后写入)。 |
事务提交后 | undo log 已写入,记录旧值。 | redo log 已写入,记录物理变化。 | 写入 binlog,记录 DELETE FROM t1 WHERE id=1 的逻辑操作。 |
事务结束(成功) | undo log 已写入,记录旧值。 | redo log 已写入,记录物理变化。 | binlog 已写入,记录逻辑操作。 |
事务回滚(失败) | 使用 undo log 回滚,恢复 id=1 行的旧值。 | 未写入(redo log 只在事务成功提交时写入)。 | 未写入(binlog 只在事务成功提交后写入)。 |