八股十问之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

相关推荐

03-12 20:46
门头沟学院 Java
最可惜的一次,滴滴二面问题基本上都能答上,可惜出了道刚好没做过的hot100,然后就挂了,唉...一面面经面试问题与知识点总结1. 项目经历1. 第一个项目 技术点: 乐观锁解决超卖问题(如秒杀场景)。 Redis分布式锁实现“一人一单”限制。 扩展问题: 分布式锁的实现细节(如Redisson的底层原理)。 超卖问题的其他解决方案(如令牌桶限流)。 2. 第二个项目 技术点: 基于Redis发布订阅机制实现线程池参数动态调整。 配置中心设计与定时任务上报线程池状态。 扩展问题: 对比Apollo、Nacos等配置中心的实现差异。 线程池参数动态调整的性能影响(如核心线程数修改的底层逻辑)。 2. Java基础1. HashMap底层实现 回答要点: JDK1.8前:数组+链表;JDK1.8后:链表长度≥8且数组长度≥64时转红黑树。 树化后若节点减少,红黑树会退化为链表(节点数≤6时)。 扩展问题: 树化阈值为8的原因(哈希冲突概率与性能权衡)。 2. ConcurrentHashMap线程安全 回答要点: JDK1.7分段锁;JDK1.8后CAS+synchronized锁桶节点。 扩展问题: ConcurrentHashMap的size()方法实现(分段统计再求和)。 3. 事务ACID与隔离级别 回答要点: MySQL默认隔离级别为可重复读(通过MVCC实现)。 脏读、不可重复读、幻读的解决方式。 扩展问题: MVCC中ReadView的生成逻辑(活跃事务ID列表)。 3. 数据库1. 索引与B+树 回答要点: B+树非叶子节点仅存索引值,叶子节点通过链表串联(支持高效范围查询)。 联合索引需满足最左匹配原则(如索引(a,b,c)需查询条件包含a)。 扩展问题: 索引下推(ICP)优化原理。 2. 红黑树 vs B+树 回答要点: 红黑树为二叉平衡树,调整频繁;B+树为多路平衡树,层高更低(减少磁盘IO)。 4. Redis1. 持久化方式 回答要点: RDB:定时快照,恢复快但可能丢数据。 AOF:追加命令日志,数据更安全但文件较大。 扩展问题: AOF重写机制(压缩命令为最终状态)。 2. 缓存击穿解决方案 回答要点: 空值缓存 + 布隆过滤器过滤无效请求。 互斥锁防止大量请求穿透到数据库。 5. Spring1. IOC与单例模式 回答要点: Spring Bean默认单例(通过单例注册表管理)。 单例的线程安全问题(无状态Bean vs 有状态Bean)。 6. 算法题题目:二叉树层序遍历(LeetCode 102)。二面---#### **1. JVM 垃圾回收算法**- **问题**:    解释 JVM 中标记清除、标记整理、标记复制三种垃圾回收算法的原理、优缺点,以及分代回收中新生代和老年代分别使用的算法。- **扩展追问**:    - 为什么新生代使用标记复制算法?    - 老年代为何更适合标记整理而非标记清除?    - 内存碎片问题在不同算法中的表现?---#### **2. ConcurrentHashMap 实现原理**- **问题**:    对比 HashMap 和 ConcurrentHashMap 的线程安全实现,解释分段锁(JDK 1.7)或 CAS + synchronized(JDK 1.8)的底层机制。- **扩展追问**:    - 分段锁如何保证并发安全?    - JDK 1.8 中为何放弃分段锁?    - ConcurrentHashMap 的 get 操作是否需要加锁?---#### **3. 生产者消费者模型实现**- **问题**:    设计一个线程安全的阻塞队列,要求支持多生产者、多消费者,并在队列满/空时阻塞等待。- **扩展追问**:    - 如何通过锁和条件变量(如 `ReentrantLock` + `Condition`)实现?    - 为什么不能直接使用 `BlockingQueue`?    - 如何处理线程唤醒的“虚假唤醒”问题?---#### **4. LRU 缓存设计**- **问题**:    实现一个 LRU 缓存,要求 `get` 和 `put` 操作的时间复杂度为 O(1)。- **扩展追问**:    - 为什么选择哈希表 + 双向链表的结构?    - 如何维护链表节点的顺序?    - 单链表能否实现?时间复杂度如何变化?---#### **5. 算法题:旋转数组的二分查找**- **问题**:    给定一个升序数组经未知次数左旋后的结果(如 `[4,5,6,7,0,1,2]`),设计算法在 O(log n) 时间内找到目标值。- **扩展追问**:    - 如何确定旋转点(分界点)?    - 如何处理二分后左右区间的有序性?    - 代码实现中的边界条件(如数组完全有序、重复元素)?---#### **面试评价方向**1. **基础深度**:JVM 垃圾回收算法、并发容器的底层实现。  2. **设计能力**:生产者消费者模型、LRU 缓存的设计思路。  3. **算法思维**:二分查找变种问题的分析与编码能力。  4. **沟通表达**:能否清晰阐述项目亮点(如乐观锁、分布式锁、动态线程池)。  ---
点赞 评论 收藏
分享
评论
3
60
分享

创作者周榜

更多
牛客网
牛客企业服务