首页 > 试题广场 >

说一说你对redo log、undo log、bin log

[问答题]
说一说你对redo log、undo log、bin log的了解 
推荐

得分点

​ 持久性、一致性、MVCC、备份

参考答案

标准回答

​ redo log用来实现事务的持久性,undo log用来实现事务的一致性以及MVCC,bin log主要用于数据备份。

  1. redo log

    重做日志用来实现事务的持久性,它由两部分组成:一是内存中的重做日志缓冲(redo log buffer),它是易失的;二是重做日志文件(redo log file),它是持久的。

    InnoDB是事务的存储引擎,其通过Force Log at Commit机制实现事务的持久性,即当事务提交时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务的COMMIT操作完成才算完成。

    为了确保每次日志都写入重做日志文件,在每次将重做日志缓冲写入重做日志文件后,InnoDB存储引擎都需要调用一次fsync操作。

  2. undo log

    事务有时还需要进行回滚操作,这时就需要undo。因此在对数据库进行修改时,InnoDB存储引擎不但会产生redo,还会产生一定量的undo。这样如果用户执行的事务或语句由于某种原因失败了,又或者用户请求回滚,就可以利用这些undo信息将数据回滚到修改之前的样子。

    redo存放在重做日志文件中,与redo不同,undo存放在数据库内部的一个特殊段中,这个段称为undo段。undo段位于共享表空间内。undo是逻辑日志,因此只是将数据库逻辑地恢复到原来的样子。当InnoDB存储引擎回滚时,它实际上做的是与先前相反的工作。对于每个INSERT,InnoDB存储引擎会完成一个DELETE;对于每个DELETE,InnoDB存储引擎会执行一个INSERT;对于每个UPDATE,InnoDB存储引擎会执行一个相反的UPDATE,将修改前的行放回去。

    除了回滚操作,undo的另一个作用是MVCC,即在InnoDB存储引擎中MVCC的实现是通过undo来完成。当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信息,以此实现非锁定读取。

  3. bin log

    二进制日志记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。总的来说,二进制日志主要有以下几种作用:

    • 恢复:某些数据的恢复需要二进制日志。
    • 复制:通过复制和执行二进制日志使一台远程的MySQL数据库与一台MySQL数据库进行实时同步。
    • 审计:用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。

加分回答

​ redo log通常是物理日志,记录的是页的物理修改操作。redo log基本上都是顺序写的,在数据库运行时不需要对redo log的文件进行读取操作。

​ undo log是逻辑日志,根据每行记录进行记录,而undo log是需要进行随机读写的。同时,undo log会产生redo log,也就是undo log的产生会伴随着redo log的产生,这是因为undo log也需要持久性的保护。

​ bin log是在数据库的上层产生的,并且bin log 不仅仅针对于InnoDB存储引擎,MySQL中任何存储引擎对于数据库的更改都会产生二进制日志。bin log 是一种逻辑日志,其记录的是对应的SQL语句,其记录的是对于每个页的修改,bin log只在事务提交完成后进行一次写入。

编辑于 2021-09-15 15:37:47 回复(0)
bin log是在服务层实现的;redo log和undo log是在引擎层实现的,且是innodb引擎独有的,主要和事务相关。
bin log中记录的是整个mysql数据库的操作内容,对所有的引擎都适用,包括执行DDL、DML,可以用来进行数据库的恢复及控制。
redo log中记录的是要更新的数据,比如一条数据已提交成功,并不会立即同步到磁盘,而是记录到redo log中,等待合适的时机再刷盘,为了实现事务的持久性。
undo log中记录的是当前操作的相反操作,如一条insert语句在undo log中会对应一条delete语句,在任务回滚时会用到undo log,实现事务的原子性,同时会用在MVCC中,undo会有一条记录的多个版本,用在快照读中。
发表于 2022-03-31 23:19:00 回复(0)

重做日志(Redo Log)

重做日志,也称为事务日志,是InnoDB崩溃恢复机制的关键组件。它是一个顺序日志,记录了数据库中的所有更改,包括插入、更新和删除。

目的:

重做日志有两个主要目的:

  1. 崩溃恢复:在崩溃事件中,重做日志允许InnoDB恢复数据库到一致状态,通过重新应用日志中的更改。
  2. 事务持久性:重做日志确保了一旦事务提交,其更改将被持久化,即使在崩溃或断电事件中。

工作原理:

  1. 当事务提交时,InnoDB将更改写入重做日志。
  2. 重做日志被写入磁盘,以确保日志的一致性。
  3. 在崩溃事件中,InnoDB读取重做日志,并重新应用更改,以恢复数据库到一致状态。

撤销日志(Undo Log)

撤销日志,也称为回滚日志,是一个记录了数据库中所有可回滚更改的日志。它用于支持事务行为,例如回滚事务如果它失败或被明确回滚。

目的:

撤销日志有两个主要目的:

  1. 事务回滚:撤销日志允许InnoDB回滚事务到其之前的状态,如果事务失败或被明确回滚。
  2. 并发控制:撤销日志帮助确保并发事务不相互干扰,通过维护数据库的一致视图。

工作原理:

  1. 当事务开始时,InnoDB创建一个撤销日志条目,每个更改数据库的操作。
  2. 如果事务被回滚或失败,InnoDB使用撤销日志恢复数据库到其之前的状态。
  3. 当事务提交时,撤销日志条目被丢弃。

二进制日志(Bin Log)

二进制日志,也称为binlog,是一个记录了数据库中所有更改的日志,包括DDL语句、DML语句和存储过程执行。

目的:

二进制日志有三个主要目的:

  1. 复制:二进制日志用于将更改从主数据库复制到一个或多个从数据库。
  2. <stron>:二进制日志允许将数据库恢复到特定时间点,通过重新应用日志中的更改。</stron>
  3. 审计:二进制日志提供了数据库中所有更改的记录,可以用于审计和安全目的。

工作原理:

  1. 当数据库中发生更改时,二进制日志被写入磁盘,以顺序方式。
  2. 二进制日志用于将更改复制到从数据库。
  3. 二进制日志可以用于将数据库恢复到特定时间点,通过重新应用日志中的更改。

总之,重做日志用于崩溃恢复和事务持久性,撤销日志用于事务回滚和并发控制,而二进制日志用于复制、点时恢复和审计。每个日志都扮演着数据库可靠性和完整性的关键角色。

发表于 2024-04-25 12:10:00 回复(0)
bin log是在服务层实现的;redo log和undo log是在引擎层实现的,且是innodb引擎独有的,主要和事务相关。
bin log中记录的是整个mysql数据库的操作内容,对所有的引擎都适用,包括执行DDL、DML,可以用来进行数据库的恢复及控制。
redo log中记录的是要更新的数据,比如一条数据已提交成功,并不会立即同步到磁盘,而是记录到redo log中,等待合适的时机再刷盘,为了实现事务的持久性。
undo log中记录的是当前操作的相反操作,如一条insert语句在undo log中会对应一条delete语句,在任务回滚时会用到undo log,实现事务的原子性,同时会用在MVCC中,undo会有一条记录的多个版本,用在快照读中。
发表于 2023-02-19 11:37:40 回复(0)