InnoDB Buffer Pool主要是用来缓存数据表和索引数据的内存区域,它的默认值为134217728字节(128MB)。最大值取决于CPU架构;32位系统上的最大值为4294967295(232-1),64位系统上的最大值为18446744073709551615(264-1)。在32位系统上,CPU体系结构和操作系统的实际最大大小可能低于标准的最大大小。当缓冲池的大小大于1GB时,将innodb_buffer_pool_instances设置为大于1的值可以提高繁忙服务器上的可伸缩性。

InnoDB缓冲池更大的场景下,多次访问相同的数据表数据所需要的磁盘I/O就更少。在专用数据库服务器上,可以将缓冲池大小设置为机器物理内存大小的80%。在配置缓冲池大小时要注意以下潜在问题,并准备在必要时缩减缓冲池的大小。

◾对物理内存的竞争会导致操作系统分页。
◾InnoDB储备增加内存缓冲区和控制结构,以便总分配空间约10%大于指定的缓冲池大小。
◾地址空间的缓冲池必须是连续的,可以是一个问题在Windows系统负载在特定地址的dll。
◾缓冲池初始化时间大约是与它的大小成正比。对于具有大型缓冲池的实例,初始化时间可能很重要。要缩短初始化周期,可以在服务器关闭时保存缓冲池状态,并在服务器启动时恢复它。

当您增加或减少缓冲池大小时,操作将以块的形式执行。块大小由innodb_buffer_pool_chunk_size配置选项定义,默认值为128mb。

缓冲池大小必须始终等于或多个innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances。如果将缓冲池大小更改为不等于或多个innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的值,缓冲池大小将自动调整为等于或多个innodb_buffer_pool_size * innodb_buffer_pool_instances的值。

innodb_buffer_pool_size可以动态设置,这允许您在不重启服务器的情况下调整缓冲池的大小。Innodb_buffer_pool_resize_status变量报告在线缓冲池调整大小操作的状态。

◾通过InnoDB api执行的活动事务和操作应该在调整缓冲池大小之前完成。
◾当启动调整大小操作时,该操作直到所有活动事务完成后才开始。调整大小操作进行后,需要访问缓冲池的新事务和操作必须等待调整大小操作完成。该规则的一个例外是,当缓冲池被碎片化并在缓冲池大小减小时回收页面时,允许对缓冲池进行并发访问。允许并发访问的一个缺点是,在提取页面时,可能会导致可用页面暂时短缺。
◾请注意如果在缓冲池调整大小操作开始后启动嵌套事务,则可能会失败。
◾在线调整Innodb缓冲池大小请在业务低峰期进行。

接下来,我们来在线调整InnoDB Buffer Pool

查看当前系统MySQL的InnoDB Buffer Pool Size为128M

mysql> show global variables like '%innodb_buffer%';
+-------------------------------------+----------------+
| Variable_name | Value |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size | |
| innodb_buffer_pool_dump_at_shutdown | ON |
| innodb_buffer_pool_dump_now | OFF |
| innodb_buffer_pool_dump_pct | |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | |
| innodb_buffer_pool_load_abort | OFF |
| innodb_buffer_pool_load_at_startup | ON |
| innodb_buffer_pool_load_now | OFF |
| innodb_buffer_pool_size | |
+-------------------------------------+----------------+
rows in set (0.00 sec)

通过设定全局系统变量innodb_buffer_pool_size来在线调整InnoDB Buffer Pool为1GB

mysql> set global innodb_buffer_pool_size=;
Query OK, rows affected (0.04 sec) mysql> show global variables like '%innodb_buffer%';
+-------------------------------------+----------------+
| Variable_name | Value |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size | |
| innodb_buffer_pool_dump_at_shutdown | ON |
| innodb_buffer_pool_dump_now | OFF |
| innodb_buffer_pool_dump_pct | |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | |
| innodb_buffer_pool_load_abort | OFF |
| innodb_buffer_pool_load_at_startup | ON |
| innodb_buffer_pool_load_now | OFF |
| innodb_buffer_pool_size | |
+-------------------------------------+----------------+
rows in set (0.00 sec) mysql> select ///
-> ;
+---------------------------+
| /// |
+---------------------------+
| 1.000000000000 |
+---------------------------+
row in set (0.00 sec)

当我们在线调整InnoDB Buffer Pool Size的时候,我们可以通过状态变量Innodb_buffer_pool_resize_status来监控Resize的进度

mysql> show global status like '%Innodb_buffer_pool_resize_status%';
+----------------------------------+----------------------------------------------------+
| Variable_name | Value |
+----------------------------------+----------------------------------------------------+
| Innodb_buffer_pool_resize_status | Completed resizing buffer pool at ::. |
+----------------------------------+----------------------------------------------------+
row in set (0.00 sec)

当然我们也可以通过查看MySQL标准错误输出文件error.log观察Resize的相关输出信息

#increasing the size of the buffer pool ouput
--20T03::.852669Z [Note] InnoDB: Resizing buffer pool from to (unit=).
--20T03::.861219Z [Note] InnoDB: Requested to resize buffer pool. (new size: bytes)
--20T03::.872100Z [Note] InnoDB: Disabling adaptive hash index.
--20T03::.873145Z [Note] InnoDB: disabled adaptive hash index.
--20T03::.873209Z [Note] InnoDB: Withdrawing blocks to be shrunken.
--20T03::.873246Z [Note] InnoDB: Latching whole of buffer pool.
--20T03::.873283Z [Note] InnoDB: buffer pool : resizing with chunks to .
--20T03::.007923Z [Note] InnoDB: buffer pool : chunks ( blocks) were added.
--20T03::.008025Z [Note] InnoDB: Resizing hash tables.
--20T03::.016691Z [Note] InnoDB: buffer pool : hash tables were resized.
--20T03::.016973Z [Note] InnoDB: Resizing also other hash tables.
--20T03::.053148Z [Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
--20T03::.053287Z [Note] InnoDB: Completed to resize buffer pool from to .
--20T03::.053317Z [Note] InnoDB: Re-enabled adaptive hash index.
--20T03::.053362Z [Note] InnoDB: Completed resizing buffer pool at ::.
在线缓冲池调整内部大小
调整大小操作由后台线程执行。当增加缓冲池大小时,调整操作:
•以块的形式添加页面(块大小由innodb_buffer_pool_chunk_size定义)
•覆盖哈希表、列表和指针来使用内存中的新地址
•在空闲列表中添加新页面
当这些操作正在进行时,其他线程将被阻止访问缓冲池。
当减小缓冲池大小时,调整操作:
•对缓冲池进行碎片整理并回收(释放)页面
•以块的形式删除页面(块大小由innodb_buffer_pool_chunk_size定义)
•转换哈希表、列表和指针,以在内存中使用新地址
在这些操作中,只有对缓冲池进行碎片整理和回收页面才能允许其他线程并发地访问缓冲池。

在线调整InnoDB Buffer Pool Size的更多相关文章

  1. innodb buffer pool小解

    INNODB维护了一个缓存数据和索引信息到内存的存储区叫做buffer pool,他会将最近访问的数据缓存到缓冲区.通过配置各个buffer pool的参数,我们可以显著提高MySQL的性能. INN ...

  2. 14.6.3.1 The InnoDB Buffer Pool

    14.6.3.1 The InnoDB Buffer Pool InnoDB 保持一个存储区域被称为buffer pool 用于cache数据和索引在内存里, 知道InnoDB buffer pool ...

  3. 14.4.3.1 The InnoDB Buffer Pool

    14.4.3.1 The InnoDB Buffer Pool 14.4.3.2 Configuring Multiple Buffer Pool Instances 14.4.3.3 Making ...

  4. 理解innodb buffer pool

    今天组里有个同事说可以查看innodb buffer pool每个表和索引占的大小,为此我搜了下,还真有方法,记录下. innodb buffer pool有几个目的: 缓存数据--众所周知,这个占了 ...

  5. [转]MySQL innodb buffer pool

    最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结. 在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_poo ...

  6. innodb buffer pool相关特性

    背景 innodb buffer pool作为innodb最重要的缓存,其缓存命中率的高低会直接影响数据库的性能.因此在数据库发生变更,比如重启.主备切换实例迁移等等,innodb buffer po ...

  7. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...

  8. 14.6.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预取

    14.6.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预取 一个预读请求是一个I/ ...

  9. 14.4.3.5 Configuring InnoDB Buffer Pool Flushing 配置InnoDB Buffer Pool 刷新:

    14.4.3.5 Configuring InnoDB Buffer Pool Flushing 配置InnoDB Buffer Pool 刷新: InnoDB执行某些任务在后台, 包括flush 脏 ...

随机推荐

  1. 如何使用Nginx和uWSGI或Gunicorn在Ubuntu上部署Flask Web应用

    你好!欢迎阅读我的博文,你可以跳转到我的个人博客网站,会有更好的排版效果和功能. 此外,本篇博文为本人Pushy原创,如需转载请注明出处:https://pushy.site/posts/151981 ...

  2. Python这个缩进让我焦头烂额!最奇葩的缩进...

        例如如下程序.     运行上面代码,如果输入年龄小于20,将会看到如下运行结果.     从上面代码可以看出,如果输入的年龄大于20,则程序会执行整体缩进的代码块. 再次重复:Python不 ...

  3. hidden field implements session

    隐藏域实现会话管理概述 如果你正在制作一个网络问卷,由于问卷内容很长,因此必须分几个页面,上一页面作答完后,必须请求服务器显示下一个页面. 但是在HTTP协议中,服务器并不会记得上一次请求的状态.既然 ...

  4. 我的blog第一天

    今天是2017年6月13号,一个很平凡的日子,但是对我来说意义非凡.这是我开通博客的第一天,这是我写的第一篇文章. 先自我介绍一下,本人邢卜,河北石家庄人,生于89年6月,说到这我马上就要过生日了!嘿 ...

  5. [TSQL|SQLSERVER|MSSQL数据库] 将数据库文件与日志附加到数据库引擎,以及转移数据库文件位置

    附加: USE [master] GO CREATE DATABASE [database_name] ON ( FILENAME = N'C:\Data\<database name>. ...

  6. MyEclipse中修改servlet模板

    1.在MyEclipse目录下搜索com.genuitec.eclipse.wizards,得到搜索结果 com.genuitec.eclipse.wizards_8.4.100.me20091213 ...

  7. Javascript---add to favorite | Set Homepage

    <!-- 设为首页 --> <li><a href="javascript:setHome(this,window.location)"> &l ...

  8. 转:socket

    最近浏览了几篇有关Socket发送消息的文章,发现大家对Socket Send方法理解有所偏差,现将自己在开发过程中对Socket的领悟写出来,以供大家参考. (一)架构 基于TCP协议的Socket ...

  9. [控件] LabelView

    LabelView 此LabelView是用来将Label显示在固定的View上的,需要计算Label的高度与宽度. 源码: NSString+StringHeight.h 与 NSString+St ...

  10. 全自动LTI部署OS

    全自动LTI部署OS:零.通过ADK制作WinPE(需包含有imagex.exe工具,用来捕获映像)一.使用WinPE中的imagex捕获映像(install.wim)二.使用MDT制作启动映像(bo ...