Redo日志 (4)—log sequence number(六十二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: Redo日志 (4)—log sequence number(六十二)

前面说了redo日志的格式,刷新到磁盘后台有线程每秒运行一次,还有事务提交的时候,buffer pool不会刷新到磁盘,但是log buffer会刷新到磁盘。Log buffer会分成若干的block,吧这些block持久化到磁盘上,mysql根目录有两个log_file0和log_file1,可以增加,当存满的时候,从0循环继续存储,默认是48Mb。每个block是512个字节,前面四个block占比2048个字节是记录管理信息,2048字节后面开始记录block。

redo日志文件格式(3)—mysql进阶(六十一)


Log sequence number


自系统修改开始,就不断的修改页面,也就不断的生成redo日志。为了记录一共生成了多少日志,于是mysql设计了全局变量log sequence number,简称lsn,但不是从0开始,是从8704开始。

我们知道log buffer中写入redo日志不是一条一条写入的,而是mtr生成的一组redo日志为单位写入,实际吧内容写在log block body处,但在统计lsn增长量时,是按照实际写入日志量占用log block header和log block tralider来计算的。举个例子:

例1:系统第一次启动初始化log buffer时,buf_free会指向第一个block偏移量为12个字节大小的地方,那么lsn值也会增加12。

那么lsn值就会记录成:8704+12 = 8716

例2:如果以mtr为一组redo日志占用存储的空间比较小,则会吧mtr占用的空间加进去。

那么lsn值就会记录成8716+200 = 8916

例3:如果以mtr为一组redo日志占用的存储空间比较大,则会吧log block header 和log block trailder占用的12个字节和4个字节也算进去。假设mtr2占用了三个block,此刻里面包含两个header 和两个trailder。

那么lsn值就会记录成1000+2*12 +4 * 2 = 1032 + 8716

至于为什么开始设置为8704呢,这是mysql规定好的,从上可以指定,每一组mtr都对应一个lsn值,如果lsn值越小,则redo日志生产的越早。


Flushed_to_disk_lsn


Redo日志首先写到log buffer中,之后才会被刷新到磁盘的redo日志文件上(ib_file0和ib_file1)。所以innoDB设计了一个全局变量buf_next_to_write,这个字段前面的数据都是已经被刷新到磁盘上的。所以log buffer的组成应该是:第一部分是到buf_next_to_write表示已经持久化到磁盘的数据,buf_next_to_write之后到buf_free表示记录的数据,还未持久化,buf_free之后的数据则是空间的log buffer。

我们前面说过lsn值代表redo日志量,包括未刷新到磁盘的redo日志,相对应的,innoDB设计了从   redo日志刷新到磁盘的全局变量,称为flushed_to_disk_lsn。系统第一次启动,lsn和flushed_to_disk_lsn值是相同的,但随着redo不断持久化到磁盘,就拉开距离了。

举例场景:当有mtr1:8716~8916

Mtr2:8916~9948

Mtr3:9948~10000

这时候因为还未持久化,所以flushed_to_disk_lsn还是8716,但是lsn值已经到了10000。

当mtr1和mtr2持久化到磁盘的时候,lsn值不变,flushed_to_disk_lsn则变为9948.

由上可以知道,当有新的redo日志,lsn值会增长,fulshed_to_disk_lsn不变,当持久化数据到磁盘的时候,则lsn不变,flushed_to_disk_lsn增长。当他们值相同的时候,说明所有redo日志已经持久化到磁盘。

LSN值和redo日志文件偏移量对应关系

因为lsn值是日志增长量的和,所以偏移量可以直接用lsn值减去初始的lsn值8704,剩下的就是redo日志文件偏移量。


Flush链表中的LSN


我们知道mtr代表一次对底层页面原子的访问,每次mtr结束的时候,都会吧redo日志写入到log buffer 中。除此之外,在mtr结束还有重要的事要做,写入到buffer pool的flush 链表中。回忆一下

Buffer pool是由控制块+碎片+缓存页组成。

而flush链表存的是还未持久化完成的脏数据,吧这些控制块通过双向链接组成链表,头部有一个链表基节点,有总的控制块数量,及其strat位子和end位子。

当第一次修改了buffer pool中的页面,则会吧这个控制块放入这个链表里,也就是链表里的位子顺序是根据第一次修改来放入的,后面就算修改因为已经存在了,直接在flush 链表修改就好。

Oldest_modification:如果某个页面被加载到buffer pool后进行第一次修改,那么就将mtr对应的lsn值写入这个。

Newest_modification:每次修改页面都会在mtr结束时候,吧lsn值写入这个。

而且每次新增的的修改页会放在flush链表的最前面。

综上知道,当第一次修改会在flush链表新增控制块,并且放在最前面,olderst_modification写入lsn值,newest_modification则是写入mtr结束时候的lsn值。如果当前页已经存在flush链表,则不需要新增当前页,old值不需要修改,吧newest值修改成mtr结束的lsn值即可。


Checkpoint


前面我们说过,log buffer内存是优先的,当使用完毕之后,我们得从第一个文件重新循环使用,所以这样很容易追尾。那我们可以想想redo日志干嘛的,是为了防止系统崩溃,记录数据,吧数据持久化到磁盘上的,那么如果已经把这些数据持久化到磁盘了,是不是系统崩溃这些数据也不需要恢复,可以放弃了呢?

用我们上面的例子,mtr1和mtr2和mtr2,当1和2已经持久化到磁盘,但修改的脏数据仍然留在buffer pool里,所以他们生成在redo日志在磁盘里的空间是不可以覆盖的。随着系统的运行,当页已经被刷新到磁盘里,这时候控制块就会从flush链表中移除。

所以这时候innoDB设计了checkpoint_lsn全局变量来代表当前系统可以覆盖的redo日志总量,这个值默认也是8704。

比方说页a刷新到磁盘上,mtr1生成的redo日志就可以被覆盖了,我们可以进行增加一个checkpoint_lsn的操作,这个过程我们称做checkpoint。做一次checkpoint可以分为两个步骤:

步骤一:计算一下当前系统中可以覆盖的redo日志对应的lsn值是多少

Redo日志可以覆盖,意味着脏数据已经刷新到磁盘,我们只要知道最早修改的脏页对应的oldest_modification,凡是checkpoint_lsn小于这个值的,都是可以覆盖的,比如我们前面的例子,最小的oldest_ modification值是8916,这时候我们吧8916赋值给checkpoint_lsn,小于这个值的都可以覆盖。

步骤二:将checkpoint _lsn和对应的redo日志文件组偏移量以及checkpoint编号写到日志文件管理信息(就是checkpoint1和checkpoint2)中

innoDB设计了一个全局变量,checkpoint_no,每做一次point就+1,还有计算checkpoint_offset偏移量,可以通过checkpoint_lsn计算。

每个redo都有2048个管理文件的信息,当checkpoint_no是偶数的时候,就存储在checpoint1中,当checkpoint_no是奇数的时候,就存储在checkpoint2中。


批量从flush链表刷出脏页


一般情况下,后台的线程都会对flush链表和lru链表刷脏到磁盘上,主要磁盘I/O操作比较慢,不想影响用户线程的处理请求。但如果系统操作频繁,写日志频繁,系统lsn增值太快。如果后台无法及时持久化脏数据,无法checkpoint,这时候可能需要用户线程同步刷新脏数据到磁盘,这样脏数据对应的redo日志没用了,就可以去checkpoint。


查看系统中的各种LSN值


我们可以用show engine innodb status;查看lsn值

其中log_sequence_number:代表系统中的lsn值,也就是当前系统的redo日志量,包括写入log buffer中的日志

Log_flushed_up_to:代表flushed_to_disk_lsn的值,代表已经写入的磁盘的redo日志字节量。

Page flushed up to:代表fulsh链表中最早修改那个页面对应的oldest_modification属性。

Last checkpoint at:当前系统的checkpoint_lsn值。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
6月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
719 54
|
7月前
|
数据库 文件存储 数据安全/隐私保护
YashanDB redo日志文件管理
YashanDB的redo日志文件用于记录数据库物理日志,支持宕机重演和主备复制。 redo日志有4种状态:NEW(新创建)、CURRENT(当前写入)、ACTIVE(未归档或未写盘)和INACTIVE(可复用)。可通过V$LOGFILE视图或直接查看$YASDB_DATA/dbfiles目录来管理redo日志。此外,支持添加、切换和删除redo日志以优化性能或应对磁盘故障等情况,但需注意仅能删除INACTIVE或NEW状态的日志以确保数据安全。
|
8月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
742 13
|
8月前
|
缓存 Java 编译器
|
8月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
190 16
|
8月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
141 4
|
8月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
974 0
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
3295 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
11月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
299 9

热门文章

最新文章