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. MS SQL Server数据库查询优化技巧

    [摘 要]本文主要是对MS SQL Server数据库查询优化技巧进行了说明和分析,对索引使用.查询条件以及数据表的设计等进行了阐述.中国论文网 http://www.xzbu.com/2/view- ...

  2. Java 实验案例(类和对象篇)

    实验任务 任务一:手机类的封装 任务二:基于控制台的购书系统 任务三:简单的投票程序 实验内容 任务一:手机类的封装 任务目的 理解和掌握面向对象的设计过程 掌握类的结构和定义过程 掌握构造方法及其重 ...

  3. 通过代码动态创建IIS站点

    对WebApi进行单元测试时,一般需要一个IIS站点,一般的做法,是通过写一个批处理的bat脚本来实现,其实通过编码,也能实现该功能. 主要有关注三点:应用程序池.Web站点.绑定(协议类型:http ...

  4. ubuntu 命令、linux环境变量设置

    解压与压缩: tar.gz格式tar -xzvf xxx jar格式jar -xvf xxx.jar zip格式unzip xxx.zip zip -r xxx.zip xxx unarunar -e ...

  5. oracle 手动打jar 包

    1.到loracle 的安装目录,D:\ProgramFiles\oracle\product\11.2.0\dbhome_1\jdbc\lib,找到文件 ojdbc6.jar,复制到 D 盘. 2. ...

  6. Excel连接字符串在.NET中的应用

    转:https://www.cnblogs.com/jaxu/archive/2011/07/29/2121022.html 介绍几种在.NET中直接连接Excel作为数据源的几种方法以及连接字符串的 ...

  7. 在 Azure 中的 Linux 虚拟机上使用 SSL 证书保护 Web 服务器

    若要保护 Web 服务器,可以使用安全套接字层 (SSL) 证书来加密 Web 流量. 这些 SSL 证书可存储在 Azure Key Vault 中,并可安全部署到 Azure 中的 Linux 虚 ...

  8. Java 使用stringTemplate导出大批量数据excel(百万级)

    目前java框架中能够生成excel文件的的确不少,但是,能够生成大数据量的excel框架,我倒是没发现,一般数据量大了都会出现内存溢出,所以,生成大数据量的excel文件要返璞归真,用java的基础 ...

  9. MVC 在视图中获取当前的Controller、Action的方式

    在视图中获取Controller和Action的方式: Controller: @ViewContext.RouteData.Route.GetRouteData(this.Context).Valu ...

  10. MongoDB 安装和使用问题总结

    1. 一直安装不了[一直next下去但最后没有发现生成文件夹] 去掉 Installing MongoDB Compass 前面的打勾 2. 需要开两个cmd运行mongodb 开第一个,输入以下运行 ...