什么?MySQL 8.0 会同时修改两个ib_logfilesN 文件?

本文通过一个实际现象,即MySQL8.0中ib_logfile文件的改动,探讨了InnoDB事务日志的工作原理。作者通过sysdig工具追踪了一个插入事务,发现log_writer_thread和log_checkpointer_thread两个后台线程分别负责写入redo日志和更新checkpoint。内容涉及到InnoDB的redo日志循环写入、checkpoint机制以及相关参数。文章强调了理论结合实践的重要性,并介绍了GreatSQL这一观测性工具。
  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者介绍:孙黎,GreatDB 认证DBA

问题现象描述

测试MySQL单机时,无意发现,MySQL 8.0的 ib_logfilesN的显示如下:

ll ib_logfile*
-rw-r----- 1 greatsql greatsql 134217728 8月 4 18:36 ib_logfile0
-rw-r----- 1 greatsql greatsql 134217728 7月 27 17:31 ib_logfile1
-rw-r----- 1 greatsql greatsql 134217728 8月 4 18:03 ib_logfile2
-rw-r----- 1 greatsql greatsql 134217728 8月 4 18:36 ib_logfile3

其中ib_logfile0、iblogfile3的 最近改动时间为:2022-08-04 18:36

印象中,MySQL 8.0对 redo 做了大量优化,难道刷盘也做了改变?

重现现象

赶紧登录到MySQL 重新执行一条insert,再观察一下。

1  ib_logfile*
2 -rw-r----- 1 greatsql greatsql 134217728 8月   9 22:55 ib_logfile0
3 -rw-r----- 1 greatsql greatsql 134217728 7月  27 17:31 ib_logfile1
4 -rw-r----- 1 greatsql greatsql 134217728 8月   4 18:03 ib_logfile2
5 -rw-r----- 1 greatsql greatsql 134217728 8月   9 22:55 ib_logfile3
6 [#3#root@greatsql82 /data/mysql8023/data 22:55:45]3 stat  ib_logfile0
7 文件:"ib_logfile0"`
8 大小:134217728       块:262144     IO 块:4096   普通文件
9 设备:fd00h/64768d      Inode:75740704    硬链接:1
10 权限:(0640/-rw-r-----)  Uid:( 1000/ greatsql)   Gid:( 1000/ greatsql)
11 最近访问:2022-08-04 19:22:32.746184752 +0800
12 最近更改:2022-08-09 22:55:40.166964294 +0800
13 最近改动:2022-08-09 22:55:40.166964294 +0800
14 创建时间:-`
15 [#4#root@greatsql82 /data/mysql8023/data 22:56:13]4 stat  ib_logfile3
16 文件:"ib_logfile3"
17 大小:134217728       块:262144     IO 块:4096   普通文件
18 设备:*******       Inode:75740707    硬链接:1
19 权限:(0640/-rw-r-----)  Uid:( 1000/ greatsql)   Gid:( 1000/ greatsql)
20 最近访问:2022-08-04 19:22:48.510210526 +0800
21 最近更改:2022-08-09 22:55:39.741963331 +0800
22 最近改动:2022-08-09 22:55:39.741963331 +0800
23 创建时间:-

在MySQL端执行一个事务后,可以看到ib_logfile0、iblogfile3都发生了改变,iblogfile3先改变,iblogfile0后改变,且改动时间相差不到0.42s

赶紧翻一下官网手册

By default, the redo log is physically represented on disk by two files named ib_logfile0 and ib_logfile1. MySQL writes to the redo log files in a circular fashion.

没有新变化,依旧是循环写
(那为啥写了iblogfile3后,还会写iblogfile0呢?)

实践追踪

最直接的当然是去看源码,一切尽在源码中。不过看代码实在太麻烦,不太适合大多数的人,gdb debug 过程,技术要求门槛较高。

有没有一个工具,能让运维人员直观地观测一下呢?

当然有!

sysdig这是笔者在GreatSQL社区了解到的一款观测性神器。

在MySQL执行

insert into test.t values(1,'aa');

追踪如下:

1 sysdig    proc.pid=2617   and  fd.type=file  
2    273983 01:02:18.534336211 1 mysqld (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值