Mysql Redo log 如何进行数据恢复的

Buffer pool

MySQL 中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到 Buffer Pool 中。 后续的查询都是先从 Buffer Pool 中找,没有命中再去硬盘加载,减少硬盘 IO 开销,提升性能。

更新表数据的时候,也是如此,发现 Buffer Pool 里存在要更新的数据,就直接在 Buffer Pool 里更新。 然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到 redo log 文件里。

innodb 日志刷盘策略

innodb_flush_log_at_trx_commit 的值有 3 种,也就是共有 3 种刷盘策略:

  • 0:设置为 0 的时候,表示每次事务提交时不进行刷盘操作。这种方式性能最高,但是也最不安全,因为如果 MySQL 挂了或宕机了,可能会丢失最近 1 秒内的事务。
  • 1:设置为 1 的时候,表示每次事务提交时都将进行刷盘操作。这种方式性能最低,但是也最安全,因为只要事务提交成功,redo log 记录就一定在磁盘里,不会有任何数据丢失。
  • 2:设置为 2 的时候,表示每次事务提交时都只把 log buffer 里的 redo log 内容写入 page cache(文件系统缓存)。page cache 是专门用来缓存文件的,这里被缓存的文件就是 redo log 文件。这种方式的性能和安全性都介于前两者中间。

在MySQL中,特别是InnoDB存储引擎中,LSNcheckpoint_lsnflushed_to_disk_lsn是与事务日志(Redo Log)和数据持久化密切相关的关键概念。以下是它们的详细解释及区别:


1. LSN(Log Sequence Number)

  • 定义
    LSN 是一个单调递增的 64 位整数,表示日志记录的序列号。每个事务操作(如数据修改)都会生成对应的 Redo Log 记录,并被分配一个唯一的 LSN。
  • 作用
    • 标识日志的写入顺序,确保事务的原子性和持久性。
    • 用于崩溃恢复时确定需要重放的日志范围。
  • 示例
    若当前 LSN 为 1000,表示数据库已生成到第 1000 字节位置的日志记录。

2. flushed_to_disk_lsn

  • 定义
    表示已持久化到磁盘的 Redo Log 的最高 LSN。所有小于或等于该值的日志记录已安全写入磁盘的 Redo Log 文件。
  • 作用
    • 确保事务提交时,其对应的 Redo Log 已落盘(通过 innodb_flush_log_at_trx_commit 控制)。
    • 崩溃恢复时,只需处理 flushed_to_disk_lsn 之后的日志(若存在)。
  • 示例
    flushed_to_disk_lsn950,说明所有 LSN ≤ 950 的日志已写入磁盘。

3. checkpoint_lsn

  • 定义
    表示最后一次检查点时,已保证将脏页(修改过的数据页)刷新到磁盘的 LSN。在此 LSN 之前的日志对应的数据修改已写入数据文件(.ibd)。
  • 作用
    • 标记崩溃恢复的起点:恢复时只需从 checkpoint_lsn 开始重放日志。
    • 回收 Redo Log 空间:早于 checkpoint_lsn 的日志可被覆盖(因数据已持久化)。
  • 示例
    checkpoint_lsn900,说明所有 LSN ≤ 900 的日志对应的数据修改已写入磁盘数据文件。

三者的关系

  1. 数值关系
    通常满足:
    checkpoint_lsnflushed_to_disk_lsnLSN

    • LSN 最大:表示最新生成的日志位置。
    • flushed_to_disk_lsn 次之:日志可能已生成但未刷盘。
    • checkpoint_lsn 最小:部分刷盘的日志可能尚未触发脏页刷新。
  2. 崩溃恢复流程

    • checkpoint_lsn 开始,重放 Redo Log 直到 flushed_to_disk_lsn(或实际写入的 LSN)。
    • 确保数据文件与日志的一致性。

监控与调优

  • 查看 LSN 信息

    SHOW ENGINE INNODB STATUS\G
    

    在输出中查找 LOG 部分,包含 Log sequence number(LSN)、Log flushed up to(flushed_to_disk_lsn)、Last checkpoint at(checkpoint_lsn)。

  • 关键参数

    • innodb_flush_log_at_trx_commit:控制日志刷盘频率,平衡性能与持久性。
    • innodb_log_file_size:Redo Log 文件大小,影响检查点频率和恢复时间。

总结

  • LSN 是日志生成的进度条。
  • flushed_to_disk_lsn 是日志持久化的保证。
  • checkpoint_lsn 是数据持久化的里程碑,决定恢复起点和日志复用。

理解这三者有助于优化数据库性能(如调整日志大小和刷盘策略)及诊断恢复问题。

results matching ""

    No results matching ""