八股十问之MySQL日志

文章来源(公众号:八股bro ,每天一篇经典面试题推送)
1. 什么是WAL机制
对于更新操作,先写日志,再写磁盘。如果每一次操作都直接写入磁盘,需要磁盘随机IO定位位置。然而,先写日志,可以通过顺序IO,提升访问效率。

2.redo_log的使用场景是什么?redo_log file记录方式是什么?
当执行更新操作时候,InnoDB引擎会把记录先写到redo_log里面,并更新内存,然后在适当时候,更新磁盘上的记录。redo_log使用循环写的方式,从头写到尾,写到末尾从头开始循环写。writePos记录当前写到的位置,checkPoint记录已经更新到数据文件的位置。

3.redo_log 的写入方式是什么?
redo_log 由两部分组成,redo log buffer和redo log file。日志回先写到redo log buffer中,然后更新到操作系统的OS buffer中转,最后更新到redo log file磁盘文件中。该过程的发生时机,受参数innodb_flush_log_at_trx_commit控制。

4.bin_log的使用场景有哪些?bin_log有什么作用?bin_log的记录格式是怎样的?
bin log是归档日志,属于MySQL Server层的日志。可以实现主从复制数据恢复两个作用。
bin_log的记录格式有三种:
a. Statement: 记录sql语句
b. Row: 记录行数据修改的细节
c. Mixed: 前两种的混合

5.bin_log 和 redo_log 之间的区别是什么?

  • redo_log 是InnoDB特有的,但是bin_log 是server层实现的,各个引擎都能使用。
  • reod_log 是物理日志,记录了某个数据页做了什么修改。bin_log是逻辑日志,记录的是语句的原始逻辑。
  • redo_log 是循环写,空间会用完。bin_log 写完一个文件会切换到下一个,不会覆盖原始数据。

6.什么是两阶段提交?
当记录更新到内存之后,会进行以下操作:
1将更新写入redo_log,进入prepare阶段
2写bin_log
3提交事务,处于commit阶段

7.如果在两阶段提交过程中,Mysql发生异常重启会发生什么?
第一种情况,如果redo_log有commit记录,直接提交事务。
第二种情况,redo_log只有prepare记录,判断bin_log是否完整(bin_log的commit标记),如果完整提交事务,否则回滚。

8.能不能只要redo_log或者只要bin_log?
如果只要bin_log,没法崩溃恢复。如果只要redo_log,理论上是可以的,但是bin_log有redo_log没有的优点,比如redo_log是循环写,历史记录无法保留。

9.数据最终落盘是从redo_log更新来的,还是从内存更新来的?
数据页被修改后,称为脏页,最终数据落盘,是把内存中的数据页写入磁盘。当崩溃发生后,如果某个数据页可能丢失了更新,会将其读入内存,通过redo_log对内存中的数据页进行修改。

10.update语句的执行过程是怎样的?
a. 判断原始数据页是否在内存中,如果不在,在读入内存。并将update后记录更新到内存。
b. 用两阶段提交的方式,写入redo_log和bin_log。
c. 在合适的时候,将更新后的记录从内存写回磁盘。

文章来源(公众号:八股bro ,每天一篇经典面试题推送)

#Java开发实习##学习路径#
全部评论
感谢楼主分享!!
点赞 回复 分享
发布于 2022-02-11 19:28

相关推荐

评论
3
60
分享

创作者周榜

更多
牛客网
牛客企业服务