MySQL 5.7 :新的日志类型MLOG_FILE_NAME来避免崩溃恢复时扫描全部ibd

news/2024/7/4 0:49:09

前言

对应 Worklog:http://dev.mysql.com/worklog/task/?id=7142

对应change log entry:

Incompatible Change: A new log record type (MLOG_FILE_NAME) is used to identify file-per-table tablespaces that have been modified since the last checkpoint. This enhancement simplifies tablespace discovery during crash recovery and eliminates scans on the file system prior to redo log application. For more information about the benefits of this enhancement, see Tablespace Discovery During Crash Recovery.

This enhancement changes the redo log format, requiring that MySQL be shut down cleanly before upgrading to or downgrading from MySQL 5.7.5.

问题:

改进的主要目的是为了消除在crash recovery时对文件目录的扫描,因为在innodb层无法根据redo log中的space id直接找到对应的文件,因此需要打开每个ibd的第一个page来进行判定。

新的修改简化了上述逻辑,只有在一次checkpoint后被修改了的表才需要被读取,其他的干净的表空间无需扫描。 在WL#7142中也处理了类似RENAME这样的崩溃恢复逻辑,不在本文的讨论范围之内,后续单独开文讨论。

 

更改:

1.REDO LOG类型修改

MLOG_FILE_CREATE2、MLOG_FILE_CREATE:使用MLOG_FILE_NAME来代替

MLOG_FILE_RENAME:使用MLOG_FILE_RENAME2来代替

增加新类型:

MLOG_FILE_RENAME2:(space_id, first_page_number, filename, new_filename)

MLOG_FILE_CREATE:(space_id, name)

MLOG_CHECKPOINT

 

详细见:enum mlog_id_t 枚举类型中关于各个类型的注释

 

2.Mini Transaction事务提交时的修改

 

当需要修改数据页时,在开启一个mini transaction后,需要:

        mtr_start(&mtr);

mtr.set_named_space(index->space);

 

set_named_space 会将当前的space id保存到mtr_t::m_named_space中

 

mtr_commit时,如果对数据做了修改,那么在5.7中分为两步。

入口函数:mtr_t::Command::execute

a.mtr_t::Command::prepare_write()

#根据set_named_space 函数设定的space id,进行判断:

 

        fil_space_t*    space

= is_predefined_tablespace(m_impl->m_named_space)

? NULL

: fil_names_write(m_impl->m_named_space, m_impl->m_mtr);

 

如果是预定义的系统表空间(ibdata, undo space ,tmp space),space = NULL; 否则调用函数 fil_names_write(m_impl->m_named_space, m_impl->m_mtr)写入一个MLOG_FILE_NAME类型的REDO记录;

 

#如果该space是上次CHECKPOINT后第一次被修改(调用 fil_names_dirty(space)),需要append一个1字节的MLOG_MULTI_REC_END类型,因为当前mtr肯定大于1个log 记录了(一个mtr可能包含多个log rec)

 

在函数fil_names_dirty中,会判断space->max_lsn值是否为0,如果为0,表示第一次修改,加入到fil_system->named_spaces链表中;否则,设置space->max_lsn为当前的log_sys->lsn; (后面再说何时reset max_lsn为0)

 

#否则,需要忽略掉在fil_names_write写入的REDO记录。

 

b.mtr_t::Command::finish_write

将redo log从cache写入redo log 公共buffer

 

3. Redo checkpoint

对应函数log_checkpoint

这里会调用函数fil_names_clear,遍历fil_system->named_spaces链表,如果space->max_lsn的值小于当前做checkpoint的LSN(在该LSN之前的脏页已经刷盘),则将其中每个space->max_lsn设置为0,并从链表取出。同时写一个MLOG_FILE_NAME日志(所有named_spaces上的成员)。

然后写一个MLOG_CHECKPOINT日志,参考函数:mtr_t::commit_checkpoint。

 

因此这个mini transaction应该包含fil_system->named_spaces链表上每个成员的MLOG_FILE_NAME日志以及紧随其后的一个MLOG_CHECKPOINT日志

 

4.崩溃恢复

 

在crash recovery时,会有一个内存结构对象来维护space id和表名的映射关系:

typedef std::map<

ulint,

file_name_t,

std::less<ulint>,

ut_allocator<std::pair<const ulint, file_name_t> > >    recv_spaces_t;

static recv_spaces_t    recv_spaces;

 

参考函数:

recv_parse_or_apply_log_rec_body–>fil_name_parse –>fil_name_process

 

 

相关代码:

http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/7825

http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/7829

http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/7888

http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/7966

http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/8152

http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/8560

 



http://www.niftyadmin.cn/n/3781846.html

相关文章

外置tomcat部署(springboot)jar包

背景&#xff1a;因为公司网络和实际硬件情况&#xff0c;有需要把springboot部署到外置tomcat的需要&#xff0c;所以用不了springboot内置的tomcat&#xff0c; 去处内置tomcat的方法简单&#xff0c;此处不再写 1、tomcat 部署&#xff08;springboot&#xff09;war包很简…

forkjoin及其性能分析,是否比for循环快?

最近看了网上的某公开课&#xff0c;其中有讲到forkjoin框架。在这之前&#xff0c;我丝毫没听说过这个东西&#xff0c;很好奇是什么东东。于是&#xff0c;就顺道研究了一番。 总感觉这个东西&#xff0c;用的地方很少&#xff0c;也有可能是我才疏学浅。好吧&#xff0c;反…

Maven 的生命周期

2019独角兽企业重金招聘Python工程师标准>>> Maven的生命周期不是一个整体&#xff0c;而是 三套 相互独立的生命周期&#xff0c;分别是 clean&#xff0c;default&#xff0c;site 。每个生命周期都有各自不同的生命阶段&#xff0c;可以单独执行一个生命周期的某…

nginx把不同请求转发到不同端口的项目(统一监听80端口)

server {listen 80;server_name 127.0.0.1;access_log logs/book.log;error_log logs/book.error;#将/wx-service请求转发给http://127.0.0.1:8011/wx-service处理location /wx-service {proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_fo…

WEB前端开发中的SEO注意点

近几年来&#xff0c;SEO在国内得到了蓬勃的发展&#xff0c;其中很多的SEO技术越来越体现在web前端的一些细节上。要做好SEO&#xff0c;WEB前端这一块也要做必不可少的优化。 这就要求我们WEB前端工程师在开发页面的时候&#xff0c;要写出规范标准的代码&#xff0c;符合SEO…

【解剖】每日一记API—一个窗口创建的过程

2013年4月6日16:31:56大家好今天是清明节放假的最后一天明天我就要去学校了所以这几天不会更新日志了&#xff0c;不过星期天回家我就更新 好&#xff0c;我们开始一个窗口的创建有一些几个步骤注册窗口WNDCLASS wnd;//定义窗口类wnd.styleCS_HREDRAW | CS_VREDRAW;//窗口类型w…

类加载机制详解

之前在介绍JVM内存模型的时候&#xff08;参看&#xff1a;JVM内存模型&#xff09;&#xff0c;提到了在运行时数据区之前&#xff0c;有个Class Loader&#xff0c;这个就是类加载器。用以把Class文件中的描述信息加载到内存中运行和使用。以下是《深入理解Java虚拟机第二版》…

Vue中前后端分离 出现跨域session不是同一个(跨域)

后端: package com.example.mybatisplustest.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer…