MST

星途 面试题库

面试题:MySQL日志恢复与一致性保障

在MySQL主从复制架构中,若主库突然崩溃,从库如何利用二进制日志和中继日志实现数据恢复,并确保数据一致性?请详细阐述其原理和具体恢复过程。
25.8万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试
  1. 原理
    • 二进制日志(Binlog):主库在执行写操作时,会将这些操作记录到二进制日志中。这些日志记录了数据库发生的所有更改,是主从复制的基础。
    • 中继日志(Relay Log):从库通过I/O线程连接主库,将主库的二进制日志拷贝到本地形成中继日志。SQL线程则从中继日志中读取事件并在从库上重放,从而保持与主库的数据一致性。
    • 当主库崩溃后,从库可以利用已经接收并保存在中继日志中的事件继续应用,同时可以根据主库崩溃前记录在二进制日志中的位置等信息,在主库恢复或新主库搭建后,继续从合适的位置进行复制。
  2. 具体恢复过程
    • 确认主库崩溃:从库检测到与主库的连接中断,通过心跳机制等方式确认主库已崩溃。
    • 应用中继日志
      • 从库的SQL线程会继续应用中继日志中尚未执行的事件。因为中继日志保存了从主库拷贝过来的写操作记录,通过重放这些记录,可以使从库的数据尽可能接近主库崩溃前的状态。
      • 例如,中继日志中记录了一系列INSERT、UPDATE、DELETE等语句,SQL线程会按照顺序依次执行这些语句。
    • 记录当前位置:在应用中继日志的过程中,从库会记录当前已经应用到中继日志的位置。这个位置信息非常关键,后续重新连接新主库或者主库恢复后进行复制时会用到。
    • 处理主库恢复或新主库搭建
      • 主库恢复
        • 主库恢复后,从库可以根据记录的中继日志位置,告知主库从哪个位置开始继续发送二进制日志。主库会从指定位置开始发送日志给从库,从库接收后继续应用,从而恢复主从复制。
        • 比如,主库崩溃前二进制日志写到了log_pos = 1000,从库已经应用到中继日志的relay_log_pos = 800,主库恢复后,从库告知主库从log_pos = 800开始发送日志。
      • 新主库搭建
        • 如果原主库无法恢复,需要搭建新主库。则可以从当前从库中挑选一个作为新主库(通常选择数据最新的从库)。
        • 其他从库需要重新配置连接到新主库。配置时,要根据之前记录的中继日志位置,计算出新主库对应的二进制日志位置,然后从该位置开始进行复制,确保数据一致性。例如,新主库上与原从库中继日志位置对应的二进制日志位置为new_master_log_pos,其他从库就从这个位置开始接收新主库的二进制日志并应用。