⾯试:mysql中binlog、undolog、redolog三种⽇志的区别
请讲下mysql中binlog、undolog、redolog三种⽇志的区别
jfinal项目分析:mysql中这三种⽇志很常见,也是⾯试中涉及⽐较多的⽅⾯,要理解清楚这三种⽇志的定位及区别;
回答要点:
主要从以下⼏点去考虑
1、三种⽇志的作⽤分别是什么;
2、三种⽇志解决的问题;
3、三种⽇志分别是什么时间写⼊的;
bin log、redo log、undo log三种⽇志属于不同级别的⽇志,按照mysql的划分可以分为服务层和引擎层两⼤层,bin log是在服务层实现的;redo log、undo log是在引擎层实现的,且是innodb引擎独有的,主要和事务相关。
bin log
bin log中记录的是整个mysql数据库的操作内容,对所有的引擎都适⽤,包括执⾏的DDL、DML,可以⽤来进⾏数据库的恢复及复制。bin log有三种形式:statement、row、mixed,statement是基于语句的,也就是执⾏的sql语句,该种形式的⽂件⽐较⼩,例,update t1 set age='24' where name like '%王%',这样⼀条语句,在statement下就会记录这样⼀条sql;row是基于数据⾏的,会记录变化的所有数据,⼀般⽂件较⼤。例,update t1 set age='24' where name like '%王%',这条语句,在row的形式下,则会记录该条sql影响的所有数据记录;mixed是混合格式,是statement和row的组合;
redo log
redo log中记录的是要更新的数据,⽐如⼀条数据已提交成功,并不会⽴即同步到磁盘,⽽是先记录到redo log中,等待合适的时机再刷盘,为了实现事务的持久性jakarta java
undo log墨茶200斤还是70斤
undo log中记录的是当前操作中的相反操作,⼀条insert语句在undo log中会对应⼀条delete语句,update语句会在undo log中对应相反的update语句,在事务回滚时会⽤到undo log,实现事务的原⼦性,同时会⽤在MVCC中,undo中会有⼀条记录的多个版本,⽤在快照读中;上⾯⼤体讲了三种⽇志
的作⽤及背景和解决的问题,有个问题⼀直困扰着我,那就是在执⾏⼀条sql时,这三种⽇志是什么时间写⼊的。
⾸先,⼀个事务刚开始,为了防⽌事务提交前回滚,要先写⼊undo log,只有写⼊了undo log才有可能实现回滚,⼜由于可能出现回滚所以开始写⼊的只有undo log;
mysql面试题型
其次,在写⼊undo log后,要写⼊redo log中,这⾥的redo log指的是redo log buffer,⽽不是redo log file,⾄于什么时候redo log buffer中的内容会刷到磁盘mysql提供了⼀个配置参数innodb_flush_log_at_trx_commit,该参数有0 1 2三种取值,;
subtotal函数排序正确用法最后,写⼊了redo log后,事务会处于prepare阶段,这时会告诉执⾏器随时都可以提交事务,执⾏器便会⽣成binlog⽇志,并写⼊磁盘,调⽤innodb的事务提交接⼝,进⾏事务提交,prepare状态的redo log也会进⼊commit状态,根据配置的innodb_flush_log_at_trx_commit的值是否把redo log buffer中的内容刷到磁盘;
下⾯总结了三种⽇志的写⼊顺序,请参考,有不当之处欢迎留⾔,
check connection

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。