2

Mysql Log 介绍

[TOC]

参考:

redo log 和 undo log 区别

一文了解InnoDB存储引擎

前言

涉及到的知识面有 Buffer Pool & Redo Log & Undo Log & BinLog & CheckPoint & 脏页。

如果每次数据更改操作都直接操作到磁盘上的话,当操作数量多起来的话,那么这些操作将变的很慢。为了提高操作之间的并发度,Mysql设计了缓存系统。

一、Buffer Pool

缓存池。当数据完成更改后,不会立马同步到磁盘上,而是先放到缓存池中。

二、Redo Log & Undo Log

2.1 Redo Log

为了防止系统掉电后,缓存池中的数据不丢失,即保证事务的持久性,特此记录一份数据修改之后的Log。例如,事务将 a 从 1 -> 2,b 从 4 -> 3,那么 Log 会记录 a:2, b:3。

2.1.1 特点
  1. 大小固定,可以通过命令设置innodb_log_write_ahead_size
  2. 写满之后,继续重头写,覆盖之前写的内容;
2.1.2 CHECKPOINT

CHECKPOINT的作用就是记录上次刷入磁盘截止的位置,这样就不用每次都刷整个 redo log了。

脏页:redo log 上与磁盘数据不同的部分叫脏页,即CHECKPOINT到本次文件光标位置所包含的数据。

2.1.3 用途
  1. 解决了数据变动立马操作磁盘的问题,提高了速度,之后便可以按照策略将redo log的日志修改数据;
  2. 当系统掉电后,通过 redo log 进行数据恢复;
2.1.4 Redo Log 刷入磁盘

按照redo log上记载的数据变化,将磁盘数据更新。本文讲的所有redo log 刷入磁盘都是指,刷入从CHECKPOINT开始到当前文件光标结束的数据。

刷入时机

  1. 定时刷入,每隔一段时间,将redo log 刷入;
  2. lru(最近最少使用)算法刷入,当Buffer Pool 空闲空间不足时,采用LRU算法淘汰缓存记录。因为缓存不见了,查询就会打到磁盘,为了保证数据一致性,得将redo log刷入磁盘;
  3. 日志不可用刷入,当将要覆盖的log还未被刷入磁盘时,将redo log刷入磁盘;

2.2 Undo Log

为了使事务在执行时能回滚到之前的状态,即保证事务的原子性,特此记录一份数据修改之前的Log。例如,事务将 a 从 1 -> 2,b 从 4 -> 3,那么 Log 会记录 a:1, b:4。

2.2.1 特点
  1. 当日志满时,新创建文件;
  2. 当文件总量过大时,删除老旧文件;
2.2.2 用途
  1. 用于事务回滚;
  2. 实现 MVCC(多版本并发控制);

2.3 记录步骤

假设有A、B两个数据,值分别为1,2.

  1. 事务开始.
  2. 记录A=1到undo log.
  3. 修改A=3.
  4. 记录A=3到redo log.
  5. 记录B=2到undo log.
  6. 修改B=4.
  7. 记录B=4到redo log.
  8. 将undo log 写入磁盘.
  9. 将redo log写入磁盘.
  10. 事务提交.

三、Binlog

Binlog是只记录对数据试图产生变化的行为,即使你更新前后数据没变化,也会记录。

有两种记录方式:

  1. 只记录sql语句;
  2. 记录执行语句前后的数据行内容;

Diuyon
67 声望148 粉丝

« 上一篇
B树和B+树
下一篇 »
TCP连接和释放