MySQL5.7:崩溃恢复“”优化“” 所带来的3例退化

简介:

背景

在MySQL5.7之前的版本中,每次崩溃恢复时都需要打开数据目录下所有的ibd文件,校验其有效性并内存中创建表空间链表。当表的数量特别多的时候, 会严重影响到崩溃恢复的性能。

为了解决这个问题,MySQL5.7版本中增加了新的日志类型MLOG_FILE_NAME及MLOG_CHECKPOINT。前者记录了被修改后的Ibd文件名,后者记录了最近一次checkpoint的LSN点。通过扫描Redo日志,InnoDB可以找到在最近一次checkpoint之后修改过的数据文件,这样在崩溃恢复时就无需打开所有的表空间。

但据我所知,这个特性至少引入了三个问题。以下简单为大家分享下

Log Parse Buffer溢出(bug#83245)

第一个问题是在做checkpoint时,会在一个mtr里将这期间修改的文件名记录到redo中,如果涉及的文件过多的话,就会导致一个mtr非常巨大,在崩溃恢复时,用于解析log的buffer(大小为2MB)会溢出。这个bug在MySQL5.7.18版本被修复。

为了避免这个问题,在做checkpoint写文件名时,如果已产生的log大小超过4个page size(LOG_CHECKPOINT_FREE_PER_THREAD), 就将当前日志提交掉并重新开启mtr(这中间不释放log_sys->mutex)

另一个修改是在崩溃恢复parse redo log的时候,如果一个log group中都是MLOG_FILE_NAME, 则直接推进recovered_offset/lsn,相当直接推进recover的点,这样在parse buffer里就无需存储整个mtr的日志。

详细修复补丁见这个commit

崩溃恢复的性能退化(bug#80788)

该特性带来的另外一个严重问题是崩溃恢复的性能退化,尤其是在表少,但需要恢复的日志量很大的时候。这是因为在崩溃恢复时最少扫描两次日志,最多要重复扫描三次,以下摘自commit log的解释

    First scan: Scan all the redo logs from checkpoint lsn and process
    only MLOG_FILE_* records during first scan. It scans till the
    last MLOG_CHECKPOINT.

    Second scan: Scan all redo logs from checkpoint lsn and add log
    records to hash table. It verifies whether space id is having
    corresponding MLOG_FILE_NAME record. If the hash table heap memory
    is reached the threshold then stop adding records to hash but it
    continues to scan till end of the redo log file.

    Third scan: Scan all redo logs from checkpoint lsn and add log records
    to hash table only if the tablespace exists. If the heap memory reached
    the threshold then simultaneous scan and apply will happen.

我在report了bug后,很快官方就确认了,但直到5.7.19版本才fix了这个问题,对崩溃恢复有要求的同学最好尽快升级到这个版本。

简单看了下官方的修复,思路也比较简单,将第一次和第二次扫描合并,这样最少一次,最多两次扫描(buffer pool不够大的时候)。

Patch链接如下:
COMMIT 1
COMMIT 2

更高的fil_system::mutex冲突(bug#85304)

由于需要在redo中记录修改的文件名,每次在做数据变更时,都会去调用函数mtr_t::set_named_space,对于用户表空间,会进一步的调用函数mtr_t::lookup_user_space-> fil_space_get 通过space id来获得表空间的fil_space_t对象,这需要fil_system::mutex的保护。在高并发下可能导致比较激烈的锁冲突。

目前MySQL5.7还没有修复计划(估计也不会去修了..),但8.0版本已经将 WL#7142的工作整体删除了,并实现了另外一套机制来加速崩溃恢复(后面单独介绍)。而针对fil_system::mutex的通用场景冲突也在优化过程中。我们可以期待下MySQL8.0版本 :)

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
6月前
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
271 0
|
4月前
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
230 6
|
10月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
5月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
148 2
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
2566 10
|
5月前
|
存储 SQL 关系型数据库
MySQL 动态分区管理:自动化与优化实践
本文介绍了如何利用 MySQL 的存储过程与事件调度器实现动态分区管理,自动化应对数据增长,提升查询性能与数据管理效率,并详细解析了分区创建、冲突避免及实际应用中的关键注意事项。
231 0
|
7月前
|
存储 SQL 关系型数据库
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
|
9月前
|
存储 关系型数据库 MySQL
MySQL细节优化:关闭大小写敏感功能的方法。
通过这种方法,你就可以成功关闭 MySQL 的大小写敏感功能,让你的数据库操作更加便捷。
729 19
|
10月前
|
关系型数据库 MySQL 数据库
从MySQL优化到脑力健康:技术人与效率的双重提升
聊到效率这个事,大家应该都挺有感触的吧。 不管是技术优化还是个人状态调整,怎么能更快、更省力地完成事情,都是我们每天要琢磨的事。
283 23
|
10月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
501 9

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多