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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
关系型数据库 MySQL 数据库
MySQL 的 change buffer 是什么?
MySQL 的 change buffer 是什么?
|
8月前
|
存储 缓存 关系型数据库
【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
311 0
|
3月前
|
SQL 缓存 关系型数据库
MySQL(三)SQL优化、Buffer pool、Change buffer
MySQL(三)SQL优化、Buffer pool、Change buffer
37 0
|
9月前
|
存储 SQL 缓存
【MySQL】change buffer,buffer pool,redo log,bin log,undo log的作用
【MySQL】change buffer,buffer pool,redo log,bin log,undo log的作用
89 0
|
4月前
|
存储 算法 关系型数据库
MySQL之深入InnoDB存储引擎——Buffer Pool
InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。在数据库系统中,由于CPU速度与磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能。在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“FIX”在缓冲池中,在下一次读取相同的页时,首先判断该页是否存在缓冲池中,如果存在则被命中,直接读取,否则读取磁盘上的页。
|
5月前
|
关系型数据库 MySQL Linux
jeecg-boot切换数据库mysql到postgresql报错:org.postgresql.util.PSQLException: 错误: 关系 “sched_name“ 不存在
jeecg-boot切换数据库mysql到postgresql报错:org.postgresql.util.PSQLException: 错误: 关系 “sched_name“ 不存在
178 0
|
6月前
|
关系型数据库 MySQL 数据安全/隐私保护
M1安装服务一条龙Mysql (解决PID的不存在的方法)
M1安装服务一条龙Mysql (解决PID的不存在的方法)
|
6月前
|
关系型数据库 MySQL 数据库
MySQL学习笔记-change buffer 和 redo log
MySQL学习笔记-change buffer 和 redo log
79 0
|
8月前
|
存储 关系型数据库 MySQL
MySQL双写缓冲区(Doublewrite Buffer)
MySQL双写缓冲区(Doublewrite Buffer)
203 0
|
9月前
|
存储 关系型数据库 MySQL
MySQL什么是数据库,什么是数据表,什么是字段,一个项目中可以存在多个数据库吗?
MySQL什么是数据库,什么是数据表,什么是字段,一个项目中可以存在多个数据库吗?
86 0