[InnoDB系列] - InnoDB Buffer Pool保存和还原补丁

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
Jeremy Cole同学写了个补丁,用于将InnoDB 缓冲池(buffer pool)里的列表在关闭mysqld时保存到本地文件中,重启启动时再加载到内存中去。该补丁目前只适用于MySQL 5.1版本。作者计划该补丁至少应具备以下几点要求:
  • 可以自定义本地文件名
  • 可以在启动时自主选择是否需要加载到内存中
  • 支持在接受用户请求前先加载一部分,剩下的可以放到后台进程中继续加载
不过,作者目前只是想到了以下几点特性,虽然有的还没有实现:
  • 采用多线程来加载,这对于使用RAID阵列更有优势
  • 支持在线保存/还原缓冲池,而无需重启mysqld
  • 增加缓冲池的统计信息,便于在加载时能选择哪些优先级别比较高,避免所有的页都以同一优先级加载
下面我们来尝试用以下这个补丁,看看效果如何。

1、准备

下载 innodb plugin 1.0.1,下载补丁 buffer_pool_save_restore.patch 和  move_buf_chunk_struct.patch。下载MySQL 5.1.26源码。
然后是解压缩,打补丁,编译。
[yejr@localhost yejr]# cd innodb_plugin-1.0.1
[yejr@localhost yejr]# patch -p1 < ../buffer_pool_save_restore.patch
patching file handler/ha_innodb.cc
Hunk #1 succeeded at 1986 with fuzz 2 (offset 67 lines).
patching file include/srv0start.h
patching file srv/srv0start.c
Hunk #1 succeeded at 1950 (offset 18 lines).
[yejr@localhost yejr]# cd ..; alias cp=cp; cp -rf innodb_plugin-1.0.1/* mysql-5.1.26-rc/storage/innobase/
[yejr@localhost yejr]# cd mysql-5.1.26-rc
[yejr@localhost yejr]# ./configure '-without-embedded-server' '-with-innodb' '-with-zlib-dir=bundled' '-with-big-tables' '-enable-assembler' '-enable-local-infile' '-with-pic' '-prefix=/usr/local/mysql' '-with-extra-charsets=complex' '-enable-thread-safe-client' && make && make install-strip
[yejr@localhost yejr]# strings /usr/local/mysql/libexec/mysqld | grep ib_buf_pool_state
可以看到,已经将该补丁编译进去了。在这里,也可以下载  percona 提供的源码,里面已经集成了其他的几个补丁。

2、测试

首先,模拟各种方法,将innodb buffer pool尽量填满,最快的办法就是导出全部数据。设置 innodb_buffer_pool_size 大小为 14G,然后导出全部数据,可以看到全部被填满了:
...
Buffer pool size   917503
Free buffers       0
Database pages     917503
Modified db pages  0
...
关闭mysqld,查看一下是不是产生了本地文件。
[yejr@localhost yejr]# mysqladmin shut
[yejr@localhost yejr]# ls -lh ib_buf_pool_state
-rw-rw----  1 mysql mysql 19M Oct  8 14:34 ib_buf_pool_state
[yejr@localhost yejr]# file ib_buf_pool_state
ib_buf_pool_state: ASCII text
[yejr@localhost yejr]# head -2 ib_buf_pool_state
43 1344258 0 69 0 122
43 1344259 0 69 0 122
[yejr@localhost yejr]# wc ib_buf_pool_state
917439  5504634 19545127 ib_buf_pool_state
然后启动mysqld,可以看到日志中记录了大量类似下面的内容:
	....
081008 14:36:28 mysqld_safe Starting mysqld daemon with databases from /data/mysql
081008 14:36:30  InnoDB: highest supported file format is Barracuda.
081008 14:36:35 InnoDB Plugin 1.0.1 started; log sequence number 205351853106
succeeded for space=43 offset=1344258 table_id=0 69 index_id=0 122
succeeded for space=43 offset=1344259 table_id=0 69 index_id=0 122
.....
然后,再看看buffer pool的情况:
...
Buffer pool size   917503
Free buffers       0
Database pages     917503
Modified db pages  0
...
可以看到,几乎填满了所有buffer pool,相当于还原到了重启前的内存状态,省去了需要经过一段时间运行才能使内存填满所需缓冲的过程,实在是方便。不过,它也有一个致命的缺点,那就是如果你的buffer pool较大(测试时最高用到14G),则启动可能会非常慢,有时候甚至无法忍受。我的测试服务器配置应该说还算不错了(dell 2950, 16Gb ram, MD3000盘阵),然而上面的测试中,启动mysqld居然花了几乎7个小时才完成,根本无法忍受。
把buffer pool大小调成6G,还是执行上面的测试,发现启动时间立刻缩小了很多,只需要  2min53s
注意:不建议在非常重要的系统中使用该补丁,万一出了问题,没人为你负责 :)
附:下面是我的一些测试数据
417439	3m0.737s
617439	4m50.357s
637439	5m38.622s
667439	6m8.553s
717439	7m10.761s
727439	7m14.659s
827439	6h20m
第一列是表示 ib_buf_pool_state 文件中有多少行数据。另外,可以通过 head/tail/grep 等工具来自主选择需要被重新加载的buffer内容。


本文转自叶金荣51CTO博客,原文链接:http://blog.51cto.com/imysql/308841,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8月前
|
存储 缓存 关系型数据库
【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
332 0
|
4月前
|
存储 算法 关系型数据库
MySQL之深入InnoDB存储引擎——Buffer Pool
InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。在数据库系统中,由于CPU速度与磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能。在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“FIX”在缓冲池中,在下一次读取相同的页时,首先判断该页是否存在缓冲池中,如果存在则被命中,直接读取,否则读取磁盘上的页。
|
SQL 关系型数据库 MySQL
|
存储 关系型数据库 MySQL
MySQL InnoDB的插入缓冲Insert Buffer
MySQL InnoDB的插入缓冲Insert Buffer
134 0
MySQL InnoDB的插入缓冲Insert Buffer
|
存储 消息中间件 缓存
老面试官问我:LRU 和 Innodb Buffer Pool 有什么关系?
老面试官问我:LRU 和 Innodb Buffer Pool 有什么关系?
老面试官问我:LRU 和 Innodb Buffer Pool 有什么关系?
|
关系型数据库 分布式数据库 PolarDB
InnoDB buffer pool flush 策略
### InnoDB buffer pool flush 策略 **1. 刷脏整体策略** 首先从整体上来说, 刷脏的coordinator_thread 会判断进入哪一种场景刷脏 在 buf_flush_page_coordinator_thread() 函数里面 刷脏主要有3个场景 1. 如果 buf_flush_sync_lsn > 0, 则因为r
690 0
|
1月前
|
存储 关系型数据库 MySQL
MySQL InnoDB数据存储结构
MySQL InnoDB数据存储结构
|
1月前
|
存储 缓存 关系型数据库
MySQL的varchar水真的太深了——InnoDB记录存储结构
varchar(M) 能存多少个字符,为什么提示最大16383?innodb怎么知道varchar真正有多长?记录为NULL,innodb如何处理?某个列数据占用的字节数非常多怎么办?影响每行实际可用空间的因素有哪些?本篇围绕innodb默认行格式dynamic来说说原理。
834 6
MySQL的varchar水真的太深了——InnoDB记录存储结构
|
3月前
|
存储 SQL 关系型数据库
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
47 1
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
|
3月前
|
存储 SQL 关系型数据库
Mysql系列-4.Mysql存储引擎-InnoDB(下)
Mysql系列-4.Mysql存储引擎-InnoDB
46 0