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 特点
- 大小固定,能够通过命令设置
innodb_log_write_ahead_size
; - 写满之后,持续重头写,笼罩之前写的内容;
2.1.2 CHECKPOINT
CHECKPOINT 的作用就是记录上次刷入磁盘截止的地位,这样就不必每次都刷整个 redo log 了。
脏页:redo log 上与磁盘数据不同的局部叫脏页,即 CHECKPOINT 到本次文件光标地位所蕴含的数据。
2.1.3 用处
- 解决了数据变动立马操作磁盘的问题,进步了速度,之后便能够依照策略将 redo log 的日志批改数据;
- 当零碎掉电后,通过 redo log 进行数据恢复;
2.1.4 Redo Log 刷入磁盘
依照 redo log 上记录的数据变动,将磁盘数据更新。本文讲的所有 redo log 刷入磁盘都是指,刷入从 CHECKPOINT 开始到以后文件光标完结的数据。
刷入机会:
- 定时刷入,每隔一段时间,将 redo log 刷入;
- lru(最近起码应用)算法刷入,当 Buffer Pool 闲暇空间有余时,采纳 LRU 算法淘汰缓存记录。因为缓存不见了,查问就会打到磁盘,为了保证数据一致性,得将 redo log 刷入磁盘;
- 日志不可用刷入,当将要笼罩的 log 还未被刷入磁盘时,将 redo log 刷入磁盘;
2.2 Undo Log
为了使事务在执行时能回滚到之前的状态,即 保障事务的原子性,特此记录一份数据批改之前的 Log。例如,事务将 a 从 1 -> 2,b 从 4 -> 3,那么 Log 会记录 a:1, b:4。
2.2.1 特点
- 当日志满时,新创建文件;
- 当文件总量过大时,删除老旧文件;
2.2.2 用处
- 用于事务回滚;
- 实现 MVCC(多版本并发管制);
2.3 记录步骤
假如有 A、B 两个数据,值别离为 1,2.
- 事务开始.
- 记录 A = 1 到 undo log.
- 批改 A =3.
- 记录 A = 3 到 redo log.
- 记录 B = 2 到 undo log.
- 批改 B =4.
- 记录 B = 4 到 redo log.
- 将 undo log 写入磁盘.
- 将 redo log 写入磁盘.
- 事务提交.
三、Binlog
Binlog 是只记录 对数据试图产生变动的行为,即便你更新前后数据没变动,也会记录。
有两种记录形式:
- 只记录 sql 语句;
- 记录执行语句前后的数据行内容;