MySQL 5.7.5: Buffer Pool 转储、恢复 以及存在的问题

简介:

MySQL提供了一个比较有用的功能,能够把buffer pool LRU上的block对应的page id 和space id 存储到文件中。在重启时,会自动读取这个转储文件,然后把对应的<space id, page id>读入到buffer pool中,快速预热内存,以尽快提供服务。

参数

使用该特性比较简单,通过多个参数控制. 简单说下几个参数

转储到文件:

innodb_buffer_pool_dump_now  : 立刻做一次buffer pool  LRU dump

innodb_buffer_pool_dump_at_shutdown : 在正常关闭实例时做一次转储

从文件中恢复:

innodb_buffer_pool_load_at_startup : 在启动实例时读入转储文件中记录的Page

innodb_buffer_pool_load_now : 立即做一次转储文件读入

innodb_buffer_pool_load_abort:立刻中断LOAD操作

5.7新加参数(http://dev.mysql.com/worklog/task/?id=6504)

innodb_buffer_pool_dump_pct : 表示转储每个bp instance LRU上最热的page的百分比。通过设置该参数可以减少转储的page数。

实现原理:

这部分代码的实现比较简单,就是在开始实例时起一个单独的线程,做page导入工作。

入口函数为buf_dump_thread, 该线程同时负责dump 和load

LOAD:

调用函数buf_load,打开转储文件,从其中读取<space_id, page_id>,并合并成一个unsigned long long类型(BUF_DUMP_CREATE),高32位为space id , 低32位为page id。这主要是为了随后对其进行快速排序(std::sort),这样就可以最可能的顺序读磁盘文件。 这对机械硬盘是有利的。但如果我们使用的是类似SSD盘,并且随时可能abort掉load操作时,我们当然希望是按照从转储文件的记录顺序读入,因为文件头总是记录的最“热”的Page (TODO)

如果转储文件中的page数大于当前Buffer pool能够容纳的page数,则忽略多出来的page。

读取page接口函数buf_read_page_background

buf_load_throttle_if_needed: 每load  innodb_io_capacity 个page,会检查innodb是否active(有用户负载),以及距离上次检查的时间间隔是否超过了1s,如果没有超过,则sleep一段时间,目的是保证1秒内读入的page数不超过innodb_io_capacity

DUMP:

dump的入口函数是buf_dump,遍历每个bp instance,根据参数innodb_buffer_pool_dump_pct计算需要记录的page数, dump的过程中持有buffer pool instance 的mutex.

目前存在的问题(5.6,5.7)

目前BP LOAD是以同步读入page的方式载入buffer pool,因此效率比较低,在我的测试机器上,只有60M/s左右的读入速度。如果修改成异步载入,可以达到每秒400M。

具体可以参考http://bugs.mysql.com/bug.php?id=73583

5.7相关代码:

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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
缓存 关系型数据库 MySQL
MySQL并发支撑底层Buffer Pool机制详解
【10月更文挑战第18天】在数据库系统中,磁盘IO操作是性能瓶颈之一。为了提高数据访问速度,减少磁盘IO,MySQL引入了缓存机制。其中,Buffer Pool是InnoDB存储引擎中用于缓存磁盘上的数据页和索引页的内存区域。通过缓存频繁访问的数据和索引,Buffer Pool能够显著提高数据库的读写性能。
564 2
|
9月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
218 16
|
9月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
191 4
|
10月前
|
缓存 关系型数据库 MySQL
图解MySQL【日志】——Buffer Pool
Buffer Pool 是数据库管理系统(DBMS)中用于缓存磁盘数据页的内存区域,主要包含数据页、索引页、undo 页等。它通过减少磁盘 I/O 提升性能,特别是在处理大型数据库时效果显著。查询时,整个数据页而非单条记录会被加载到 Buffer Pool 中,以提高访问效率。
205 0
图解MySQL【日志】——Buffer Pool
|
10月前
|
存储 缓存 关系型数据库
MySQL进阶突击系列(08)年少不知BufferPool核心原理 | 大哥送来三条大金链子LRU、Flush、Free
本文深入探讨了MySQL中InnoDB存储引擎的buffer pool机制,包括其内存管理、数据页加载与淘汰策略。Buffer pool作为高并发读写的缓存池,默认大小为128MB,通过free链表、flush链表和LRU链表管理数据页的存取与淘汰。其中,改进型LRU链表采用冷热分离设计,确保预读机制不会影响缓存公平性。文章还介绍了缓存数据页的刷盘机制及参数配置,帮助读者理解buffer pool的运行原理,优化MySQL性能。
|
运维 DataWorks 关系型数据库
DataWorks产品使用合集之DataWorks还有就是对于mysql中的表已经存在数据了,第一次全量后面增量同步的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
131 2
|
存储 关系型数据库 MySQL
MySQL Change Buffer 深入解析:概念、原理及使用
MySQL Change Buffer 深入解析:概念、原理及使用
MySQL Change Buffer 深入解析:概念、原理及使用
|
存储 缓存 关系型数据库
深度解密 MySQL 的 Buffer Pool
深度解密 MySQL 的 Buffer Pool
263 0
|
SQL 缓存 关系型数据库
(十二)MySQL之内存篇:深入探寻数据库内存与Buffer Pool的奥妙!
MySQL是基于磁盘工作的,这句几乎刻在了每个后端程序员DNA里,但它真的对吗?其实答案并不能盖棺定论,你可以说MySQL是基于磁盘实现的,这点我十分认同,但要说MySQL是基于磁盘工作,这点我则抱否定的态度,至于为什么呢?这跟咱们本章的主角:Buffer Pool有关,Buffer Pool是什么?还记得咱们在《MySQL架构篇》中聊到的缓存和缓冲区么,其中所提到的写入缓冲区就位于Buffer Pool中。
1311 1
|
缓存 关系型数据库 MySQL
MySQL Buffer Pool 解析:原理、组成及作用
MySQL Buffer Pool 解析:原理、组成及作用