在线调整InnoDB Buffer Pool Size

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       | 134217728      |
| innodb_buffer_pool_dump_at_shutdown | ON             |
| innodb_buffer_pool_dump_now         | OFF            |
| innodb_buffer_pool_dump_pct         | 25             |
| innodb_buffer_pool_filename         | ib_buffer_pool |
| innodb_buffer_pool_instances        | 1              |
| innodb_buffer_pool_load_abort       | OFF            |
| innodb_buffer_pool_load_at_startup  | ON             |
| innodb_buffer_pool_load_now         | OFF            |
| innodb_buffer_pool_size             | 134217728      |
+-------------------------------------+----------------+
10 rows in set (0.00 sec)

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

mysql> set global innodb_buffer_pool_size=1073741824;
Query OK, 0 rows affected (0.04 sec)

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

mysql> select 1073741824/1024/1024/1024
    -> ;
+---------------------------+
| 1073741824/1024/1024/1024 |
+---------------------------+
|            1.000000000000 |
+---------------------------+
1 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 190320 11:30:07. |
+----------------------------------+----------------------------------------------------+
1 row in set (0.00 sec)

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

#increasing the size of the buffer pool ouput
2019-03-20T03:30:06.852669Z 0 [Note] InnoDB: Resizing buffer pool from 134217728 to 1073741824 (unit=134217728).
2019-03-20T03:30:06.861219Z 1930980 [Note] InnoDB: Requested to resize buffer pool. (new size: 1073741824 bytes)
2019-03-20T03:30:06.872100Z 0 [Note] InnoDB: Disabling adaptive hash index.
2019-03-20T03:30:06.873145Z 0 [Note] InnoDB: disabled adaptive hash index.
2019-03-20T03:30:06.873209Z 0 [Note] InnoDB: Withdrawing blocks to be shrunken.
2019-03-20T03:30:06.873246Z 0 [Note] InnoDB: Latching whole of buffer pool.
2019-03-20T03:30:06.873283Z 0 [Note] InnoDB: buffer pool 0 : resizing with chunks 1 to 8.
2019-03-20T03:30:07.007923Z 0 [Note] InnoDB: buffer pool 0 : 7 chunks (57344 blocks) were added.
2019-03-20T03:30:07.008025Z 0 [Note] InnoDB: Resizing hash tables.
2019-03-20T03:30:07.016691Z 0 [Note] InnoDB: buffer pool 0 : hash tables were resized.
2019-03-20T03:30:07.016973Z 0 [Note] InnoDB: Resizing also other hash tables.
2019-03-20T03:30:07.053148Z 0 [Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
2019-03-20T03:30:07.053287Z 0 [Note] InnoDB: Completed to resize buffer pool from 134217728 to 1073741824.
2019-03-20T03:30:07.053317Z 0 [Note] InnoDB: Re-enabled adaptive hash index.
2019-03-20T03:30:07.053362Z 0 [Note] InnoDB: Completed resizing buffer pool at 190320 11:30:07.
在线缓冲池调整内部大小
调整大小操作由后台线程执行。当增加缓冲池大小时,调整操作:
•以块的形式添加页面(块大小由innodb_buffer_pool_chunk_size定义)
•覆盖哈希表、列表和指针来使用内存中的新地址
•在空闲列表中添加新页面
当这些操作正在进行时,其他线程将被阻止访问缓冲池。
当减小缓冲池大小时,调整操作:
•对缓冲池进行碎片整理并回收(释放)页面
•以块的形式删除页面(块大小由innodb_buffer_pool_chunk_size定义)
•转换哈希表、列表和指针,以在内存中使用新地址
在这些操作中,只有对缓冲池进行碎片整理和回收页面才能允许其他线程并发地访问缓冲池。

原文地址:https://www.cnblogs.com/Y3boy001/p/10564760.html

时间: 2024-07-29 22:02:27

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

innodb buffer pool小解

INNODB维护了一个缓存数据和索引信息到内存的存储区叫做buffer pool,他会将最近访问的数据缓存到缓冲区.通过配置各个buffer pool的参数,我们可以显著提高MySQL的性能. INNODB的buffer pool是基于LRU算法来实现的,我们可以简单了解以下LRU算法: LRU: least recently used ,INNODB管理buffer poll是将buffer pool作为一个list管理,基于LRU算法的管理.当有新的页信息要读入到buffer pool里面的

020:InnoDB Buffer Pool

一. 缓冲池(Buffer Pool) 1. 缓冲池介绍 每次读写数据都是通过 Buffer Pool : 当Buffer Pool 中没有用户所需要的数据时,才去硬盘中获取: 通过 innodb_buffer_pool_size进行设置总容量,该值设置的越大越好: innodb_buffer_pool_instances 设置为多个缓冲池: 总容量还是innodb_buffer_pool_size 设置多个instance 可将热点打散,提高并发性能(建议设置成CPU个数值) Buffer P

innodb buffer pool相关特性

背景 innodb buffer pool作为innodb最重要的缓存,其缓存命中率的高低会直接影响数据库的性能.因此在数据库发生变更,比如重启.主备切换实例迁移等等,innodb buffer poll 需要一段时间预热,期间数据库的性能会受到明显影响.另外mysql 5.7以前innodb buffer pool缓存大小修改不是动态的,重启才能生效.因此innodb buffer pool的预热和innodb buffer pool大小的动态修改,对性能要求较高的应用来说是不错的特性,下面我

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

MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数个内存块加上一组控制结构体对象组成.内存块的个数取决于buffer pool instance的个数,不过在5.7版本中开始默认以128M(可配置)的chunk单位分配内存块,这样做的目的是为了支持buffer pool的在线动态调整大小. Buffer pool的每个内存块通过mmap的方式分配内

Innodb Buffer Pool内部结构

Innodb Buffer Pool内部结构 1.    Innodb Buffer 功能 Innodb buffer pool的主要功能存储外存页面在内存中的镜像.镜像有如下2种镜像: (1)只读镜像:只读镜像读取的是非脏页. (2)更新镜像:更新镜像为buffer pool中的脏页. Innodb实现了行级多版本(MVCC),而不是整个页的多版本.Oracle在实现中存在第三种镜像,就是版本镜像.而innodb中确实没有.在innodb中任何外存中的脏页的读取以及更新都是在buffer po

MYSQL的InnoDB Buffer Pool内部机制

1. 基本结构:INNODB用least recently used (LRU) 算法来管理他的buffer_pool. buffer_pool在内部被分隔为两个list. a young list 和 a old list. Young list 存储那些高频使用的缓存数据(默认占整个BUFFER的5/8) Old list 存储那些低频使用的数据(默认占整个BUFFER的3/8) 2.使用机制:当一个新块数据被从磁盘缓存到buffer当中,它默认被放在Old list的头部,即midpoin

mysql_存储引擎层-innodb buffer pool

buffer pool 是innodb存储引擎带的一个缓存池,查询数据时,首先从内存中查询 数据如果内存中存在的话直接返回. innodb buffer pool 和 qcache 的区别:Qcache 缓存的是sql语句对应的结果集, buffer pool中缓存的是表中的数据(热).buffer pool是设置的越大越好,一般设置为 物理服务器内存的70% 参数: innodb_buffer_pool_size innodb_buffer_pool的大小 innodb_buffer_pool

InnoDB buffer pool 刷新快慢取决因素

innodb buffer pool 刷新快慢取决于两个参数 mysql> show variables like 'innodb_io_capacity%';+------------------------+-------+| Variable_name | Value |+------------------------+-------+| innodb_io_capacity | 200 || innodb_io_capacity_max | 2000 |+---------------

innodb buffer pool

InnoDB Plugin特性介绍:让Buffer Pool不被污染 较之MyISAM的一个很大的优势是,InnoDB会缓存数据块.如果系统中的数据量并不大,或者或者活跃数据量并不大时,InnoDB会将这些数据块全部缓存到Buffer Pool(内存)中,这样可以最大限度的提高提供的响应速度,特别是读取.当用户请求需要查询数据块时,InnoDB会首先在Buffer Pool中查找数据,如果Buffer Pool中没有该数据块时,InnoDB会从磁盘上Load对应的数据块,并通过LRU算法替代当前