Mysql Log 介绍
[TOC]
参考:
前言
涉及到的知识面有 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语句;
- 记录执行语句前后的数据行内容;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。