热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL5.7新特性:在线truncateundolog文件

在MySQL5.7.5版本中,增加了一个比较有用的功能,即用户可以自己truncate掉undolog。对应的changelingentry如下

在MySQL5.7.5版本中,增加了一个比较有用的功能,即用户可以自己truncate掉undo log。 对应的changeling entry如下:

InnoDB: You can now truncate undo logs that reside in undo tablespaces. This feature is enabled using theinnodb_undo_log_truncate configuration option. For more information, see Truncating Undo Logs That Reside in Undo Tablespaces.

我们知道Undo log是MVCC多版本控制的核心模块,一直以来undo log都存储在ibdata系统表空间中,而从5.6开始,用户可以把undo log存储到独立的tablespace中,并拆分成多个Undo log文件。 但5.6及5.6之前的版本都无法缩小文件的大小。而长时间未提交事务导致大量undo 空间的浪费的例子,在我们的生产场景也不是一次两次了。

5.7的undo log的truncate操作是基于独立undo 表空间来实现的

0.相关参数

在能够使用该特性之前,需要先打开独立undo表空间,注意现在只能在install db的时候才能开启,因为他在初始化阶段是写死占用了最小的几个space id的…这种实现方式。。。只能无限吐槽 了- -..
有几个参数控制undo tablespace:
innodb_undo_directory: Undo文件的存储目录
innodb_undo_tablespaces: undo tablespace的个数,至少大于等于2,因为在truncate一个undo log文件时,要保证另外一个是可用的,这样就无需停止业务了.
innodb_undo_logs: undo回滚段的数量, 至少大于等于35,默认128.官方博客对35这个数字的解释:

The value of 35 comes from how the UNDO logs (rollback segments or rsegs) are allocated—0: REDO enabled rseg allocated in the system tablespace, 1-32: non-REDO enabled rsegs allocated in the temporary tablespace, 33-n: REDO enabled rsegs allocated in UNDO table spaces

0         -> rseg resides always in system tablespace
1..32  -> rseg resides in shared temporary tablespace (ibtmp1)

33     -> undo-tablespace-0
34     -> undo-tablespace-1
….
33+n-1 -> undo-tablespace-n-1 (undo tablespace indexes from 0 so n-1 is last).
33+n   -> undo-tablespace-0
33+n+1 -> undo-tablespace-1
….
m      -> undo-tablespace-x

innodb_purge_rseg_truncate_frequency: 用于控制purge回滚段的频度.

innodb_max_undo_log_size: 控制最大undo tablespace文件的大小,超过这个阀值时才会去尝试truncate. truncate后的大小默认为10M

打开/关闭该特性,使用动态参数innodb_undo_log_truncate控制

root@(none) 06:43:29>set global innodb_undo_log_truncate = ON;
Query OK, 0 rows affected (0.00 sec)

root@(none) 06:43:32>set global innodb_undo_log_truncate = OFF;
Query OK, 0 rows affected (0.00 sec)

下面简单介绍下实现的相关代码
0.新的truncate管理结构体

新的类undo::Truncate被引入,来管理table space truncate的过程
挂在purge_sys->undo_trunc中

1.标记需要truncate的undo tablespace

这个动作实际上是由purge的协调线程发起的,默认情况下每做128次purge后,会调用函数trx_purge_truncate进行清理操作,我们只关心truncate,对应的调用栈为:
trx_purge_truncate
|—>trx_purge_truncate_history
|—>trx_purge_mark_undo_for_truncate
|—>trx_purge_initiate_truncate

trx_purge_mark_undo_for_truncate 是标记truncate undo表空间的入口函数,主要包括如下步骤
step1: 检查是否开启truncate参数,或者已经有table space已经被标记为truncate

step2:检查是否可以进行安全的truncate,也就是上面说的innodb_undo_tablespaces>=2,  innodb_undo_logs>=35

step3:从上次扫描的tablespace开始遍历(round-robin),哪些tablespace可以标记为可truncate,如果发现一个需要truncate的 tablespace,则标记其为需要truncate,并从遍历中break出来:
undo_trunc->mark(space_id);
undo::Truncate::add_space_to_trunc_list(space_id);

step4: 遍历被选中的table space中的回滚段,将其设置为不可分配,判断条件为:

917                 if (rseg != NULL && !trx_sys_is_noredo_rseg_slot(rseg->id)) {
918                         if (rseg->space
919                                 == undo_trunc->get_marked_space_id()) {
920
921                                 /* Once set this rseg will not be allocated
922                                 to new booting transaction but we will wait
923                                 for existing active transaction to finish. */
924                                 rseg->skip_allocation = true;
925                                 undo_trunc->add_rseg_to_trunc(rseg);
926                         }
927                 }

2. truncate operation

在标记需要truncate的tablespace后,需要先检查需要删除的回滚段是否是可释放的。也就是没有任何活跃的事务会应用到其中的Undo log

入口函数:trx_purge_initiate_truncate

step 1: 检查回滚段是否可释放,如果不可以(有活跃事务可能使用undo做MVCC),直接返回

step 2:做一次redo checkpoint,因为如果随后发生crash,可能针对该undo tablespace的redo 就会无效了,因为文件被truncate了。
log_make_checkpoint_at(LSN_MAX, TRUE);  这会刷新所有脏页和redo log.

step 3.开始之前…
1100                 undo_trunc->start_logging(
1101                         undo_trunc->get_marked_space_id());

创建一个命名为undo__trunc.log的文件,如果crash重启发现该文件,则表明truncate tablespace可能没有完成,需要重做.

step 4: 清理对应的purge queue,无需继续做Purge 操作
trx_purge_cleanse_purge_queue(undo_trunc);

step5 : 执行真正的truncate

bool    success = trx_undo_truncate_tablespace(undo_trunc);

入口函数:trx_undo_truncate_tablespace
..truncate文件
success = fil_truncate_tablespace(
space_id, SRV_UNDO_TABLESPACE_SIZE_IN_PAGES);

文件先被truncate到0,再重新设置到10M,相当于一个新建的undo tablespace.

…重新初始化undo log tablespace的头,这个过程不记录redo log.
fsp_header_init(space_id, SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr);

…重新初始化该tablespace内的回滚段头

step 6:在完成truncate后,再做一次checkpoint

step 7: 完成后
undo_trunc->done_logging(undo_trunc->get_marked_space_id());

删除undo__trunc.log

step 8: 清理操作

undo_trunc->reset();
undo::Truncate::clear_trunc_list();

worklog:
http://dev.mysql.com/worklog/task/?id=6965

相关代码:
http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/8631
http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/8629
http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/8622
http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/8615

官方博客描述:
http://mysqlserverteam.com/online-truncate-of-innodb-undo-tablespaces/





推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在配置Nginx的SSL证书后,虽然HTTPS访问能够正常工作,但HTTP请求却会遇到400错误。本文详细解析了这一问题,并提供了Nginx配置的具体示例。此外,还深入探讨了DNS服务器证书、SSL证书的申请与安装流程,以及域名注册、查询方法和CDN加速技术的应用,帮助读者全面了解相关技术细节。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
author-avatar
天天火火红红
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有