MySQL数据库作为目前最流行的关系型数据库管理系统之一,开发者在面试中经常会被问到这个问题。其中,Undo Log、Redo Log和Bin Log是MySQL中最重要的三种日志,它们各自承担着不同的职责(各司其职),共同保障数据库的数据一致性、持久性和可恢复性。
本篇文章用作个人面试后的复盘,也希望能给各位大佬带来帮助。
Undo Log主要用于实现事务的原子性,保证在事务失败或需要回滚时,能够将数据恢复到事务开始前的状态。
Undo Log主要属于InnoDB存储引擎,它记录了数据修改前的状态,就是记录的“旧值”。当事务需要回滚时,InnoDB引擎可以利用Undo Log中的信息来撤销已做的修改,使数据库恢复到事务开始前的状态。
除此之外呢,Undo Log还可以用于支持多版本并发控制(就是面试中常见的MVCC),允许多个事务并发访问数据库时,每个事务看到的数据都是一致的、未被其他事务干扰的版本。
非物理页面的变化
。Undo Log缓冲区或直接写入Undo Log文件中
。Redo Log主要用于实现事务的持久性,确保在数据库系统发生故障(比如宕机)后,已提交的事务所做的修改不会丢失。
和Undo Log一样,Redo Log也是InnoDB存储引擎
特有的,它记录了数据页的物理变化
(重!!!),即“新值”。当数据库系统重启时,InnoDB引擎可以利用Redo Log中的信息来恢复数据,从而来确保数据的一致性和完整性。
Redo Log记录的是数据页的物理修改
,比如数据页的更新、插入或删除。当日志空间满时,会覆盖最早的日志记录
。innodb_flush_log_at_trx_commit
参数来控制Redo Log的刷盘时机,从而确保数据的持久性。Bin Log是
MySQLServer层生成的日志
,ta记录了所有修改数据库数据的SQL语句(比如INSERT、UPDATE、DELETE等),但是不包括SELECT、SHOW等不修改数据的语句。(重点!!!)
Bin Log主要用于数据恢复、主从复制和数据同步。通过Bin Log日志,我们可以在数据库发生故障时恢复数据,或者在主从复制架构中同步数据到从服务器。
SQL语句的逻辑操作
,而不是物理页面的变化(和Redo Log区别开)。它们三个的区别大致可以分为四个模块,重点来了!!!👇👇👇
适用对象:
Undo Log和Redo Log是InnoDB存储引擎特有的。 而Bin Log是MySQL Server层生成的,所有存储引擎都可以使用。
记录内容:
Undo Log记录的是数据修改前的状态(旧值),用于回滚和MVCC。 Redo Log记录的是数据页的物理变化(新值),用于崩溃恢复。 Bin Log记录的是修改数据库的逻辑SQL语句,用于数据恢复、主从复制和数据同步。
存储方式:
Undo Log以数据页或回滚段的形式存储在数据文件中。 Redo Log以循环写入的方式存储在专用的Redo Log文件组中。 BinLog以二进制文件的形式存储在文件系统中。
触发时机:
Undo Log在事务执行期间,对数据库进行修改操作时触发。 RedoLog在事务执行期间,对数据库进行物理修改时触发,并在事务提交前或发生崩溃时写入磁盘。 Bin Log在事务提交时触发,记录该事务的逻辑变更操作。
这块知识点是我们开发人员面试中的重中之重!!!希望文章对小伙伴们面试有帮助!
本篇文章到这里就结束了,感谢各位小伙伴们的支持!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。