重做日志(Redo Log)
重做日志,也称为事务日志,是InnoDB崩溃恢复机制的关键组件。它是一个顺序日志,记录了数据库中的所有更改,包括插入、更新和删除。
目的:
重做日志有两个主要目的:
工作原理:
撤销日志(Undo Log)
撤销日志,也称为回滚日志,是一个记录了数据库中所有可回滚更改的日志。它用于支持事务行为,例如回滚事务如果它失败或被明确回滚。
目的:
撤销日志有两个主要目的:
工作原理:
二进制日志(Bin Log)
二进制日志,也称为binlog,是一个记录了数据库中所有更改的日志,包括DDL语句、DML语句和存储过程执行。
目的:
二进制日志有三个主要目的:
工作原理:
总之,重做日志用于崩溃恢复和事务持久性,撤销日志用于事务回滚和并发控制,而二进制日志用于复制、点时恢复和审计。每个日志都扮演着数据库可靠性和完整性的关键角色。
得分点
持久性、一致性、MVCC、备份
参考答案
标准回答
redo log用来实现事务的持久性,undo log用来实现事务的一致性以及MVCC,bin log主要用于数据备份。
redo log
重做日志用来实现事务的持久性,它由两部分组成:一是内存中的重做日志缓冲(redo log buffer),它是易失的;二是重做日志文件(redo log file),它是持久的。
InnoDB是事务的存储引擎,其通过Force Log at Commit机制实现事务的持久性,即当事务提交时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务的COMMIT操作完成才算完成。
为了确保每次日志都写入重做日志文件,在每次将重做日志缓冲写入重做日志文件后,InnoDB存储引擎都需要调用一次fsync操作。
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读取之前的行版本信息,以此实现非锁定读取。
bin log
二进制日志记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。总的来说,二进制日志主要有以下几种作用:
加分回答
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只在事务提交完成后进行一次写入。