MySQL的7种日志(三):UndoLog

0.前言

续:

MySQL的7种日志(一):概况

MySQL的7种日志(二):RedoLog

1.什么是undolog

2.undolog的作用

3.undolog的存储

3.1 物理存储位置

找到具体存放的位置

MySQL5.6.3 之前的版本undolog存储在系统共享表空间里,后续的版本推荐存话在单独的文件中

mysql> show global variables like '%undo%';
+--------------------------+-------------------------+
| Variable_name            | Value                   |
+--------------------------+-------------------------+
| innodb_max_undo_log_size | 1073741824              |
| innodb_undo_directory    | /data/mysql3306/innolog |
| innodb_undo_log_encrypt  | OFF                     |
| innodb_undo_log_truncate | ON                      |
| innodb_undo_tablespaces  | 2                       |
+--------------------------+-------------------------+
5 rows in set (0.01 sec)

在系统中查看

ll -h /data/mysql3306/innolog
total 4.9G
-rw-r----- 1 mysql mysql 1.0G May 28 15:52 ib_logfile0
-rw-r----- 1 mysql mysql 1.0G May 28 02:07 ib_logfile1
-rw-r----- 1 mysql mysql 1.0G May 28 08:11 ib_logfile2
-rw-r----- 1 mysql mysql 1.0G May 28 15:11 ib_logfile3
-rw-r----- 1 mysql mysql 491M May 28 15:52 undo_001
-rw-r----- 1 mysql mysql 411M May 28 15:52 undo_002

其中 undo_001,undo_002 就是undolog

MySQL版本变更带来的undolog变化

3.2 物理存储结构

环境说明

刚才我们已经找到了undolog的具体位置,接下来我们通过分析这个文件来了解undolog的存储结构

此次分析,我们用到环境是MySQL8.0.24

解析undo_001文件

通过自制的工具,扫描/data/mysql3306/innolog/undo_001 ,解析出文件信息如下

文件:/data/mysql3306/innolog/undo_001
解析文件成功,正在分析...
共有491.0M,16k/页,共有31424页
 Page(0-->1) 文件空间头:共1页,
 Page(1-->2) 插入缓冲位图:共1页,
 Page(2-->3) 文件段inode页:共1页,
 Page(3-->4) 回滚段-数组页:共1页,
 Page(4-->88) 系统页:共84页,
 Page(88-->89) 文件段inode页:共1页,
 Page(89-->133) 系统页:共44页,
 Page(133-->174) Undo 日志页:共41页,
 Page(174-->175) 文件段inode页:共1页,
 Page(175-->260) Undo 日志页:共85页,
 Page(260-->261) 文件段inode页:共1页,
 Page(261-->420) Undo 日志页:共159页,
 Page(420-->421) 文件段inode页:共1页,
 Page(421-->16384) Undo 日志页:共15963页,
 Page(16384-->16385) 扩展说明页:共1页,
 Page(16385-->16386) 插入缓冲位图:共1页,
 Page(16386-->23692) Undo 日志页:共7306页,
 Page(23692-->23744) 新分配的页:共52页,
 Page(23744-->30592) Undo 日志页:共6848页,
 Page(30592-->31424) 新分配的页:共832页,

undolog001

这是一个线上系统的真实的undolog真实的物理存储状态。为了便于分析,下面建一个新实例3406,设置undo文件大小为20M,分析文件:/data/mysql3406/innolog/undo_001 得到结果:

文件:/data/mysql3406/innolog/undo_001
解析文件成功,正在分析...
共有10.0M,16k/页,共有640页
 Page(0-->1) 文件空间头:共1页,
 Page(1-->2) 插入缓冲位图:共1页,
 Page(2-->3) 文件段inode页:共1页,
 Page(3-->4) 回滚段-数组页:共1页,
 Page(4-->88) 系统页:共84页,
 Page(88-->89) 文件段inode页:共1页,
 Page(89-->133) 系统页:共44页,
 Page(133-->174) Undo 日志页:共41页,
 Page(174-->175) 文件段inode页:共1页,
 Page(175-->260) Undo 日志页:共85页,
 Page(260-->261) 文件段inode页:共1页,
 Page(261-->278) Undo 日志页:共17页,
 Page(278-->640) 新分配的页:共362页,

我们得到一个精简的undolog文件存储示意图,如下,点开第133页,可以看到具体的存储内容,一个字节一个字节的可以看到真实的存储内容(需要对照MySQL源码,如果有时间的话,我可能会undolog的分析工具,如果有时间的话,下次一定写…)

undolog002

4.undo log的工作原理

4.1 undo log实现原子性和持久化的原理:

假设有dboop_test1、dboop_test2两张表,分别有两条数据为:1,2。

begin ;
update dboop_test1 set A=3 where A=1; 
update dboop_test2 set B=4 where B=2; 
...
commit;

之所以能同时保证原子性和持久化,是因为以下特点:

4.1 undo log 实现mvcc

事务A,修改数据:

假定有这样一条数据

select * from dboop_test1
A,B
1,2

begin ;
update  dboop_test1 set B=3 where A=1; 
select sleep(50000);
commit;

事务B,立即去读:

begin ;
select B from   dboop_test1 where A=1; 
select sleep(10);
select B from   dboop_test1 where A=1; 
select sleep(10);
select B from   dboop_test1 where A=1; 
....
commit;

# 这里读取到的的值始终是B=2

补充:快照读/当前读

>> Home

51ak

2022/05/28

Categories: mysql 日志 Tags: 原创 精品

《数据库工作笔记》公众号
扫描上面的二维码,关注我的《数据库工作笔记》公众号