10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国Ltr)- 41.6 mb
PDF (A4)- 41.7 mb
手册(TGZ)- 262.2 kb
手册(Zip)- 372.3 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

15.8.3.1配置InnoDB缓冲池大小

您可以配置InnoDB脱机或服务器运行时缓冲池大小。本节描述的行为适用于这两种方法。有关在线配置缓冲池大小的其他信息,请参见在线配置InnoDB缓冲池大小

增加或减少时通过innodb_buffer_pool_size时,操作以块的形式执行。块大小由innodb_buffer_pool_chunk_size配置选项,该选项的默认值为128米.有关更多信息,请参见配置InnoDB缓冲池块大小

缓冲池大小必须总是等于或的倍数innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances.如果你配置通过innodb_buffer_pool_size不等于或不等于的倍数的值innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances,缓冲池大小自动调整为等于或的倍数innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances

在下面的例子中,通过innodb_buffer_pool_size设置为8 g,innodb_buffer_pool_instances设置为16innodb_buffer_pool_chunk_size128米,为默认值。

8 g是有效的通过innodb_buffer_pool_size价值的,因为8 g是的倍数innodb_buffer_pool_instances = 16innodb_buffer_pool_chunk_size = 128,即2 g

shell> mysqld——innodb-buffer-pool-size=8G——innodb-buffer-pool-instances=16
SELECT @@innodb_buffer_pool_size/1024/1024;+------------------------------------------+ | @@ 通过innodb_buffer_pool_size / 1024/1024/1024  | +------------------------------------------+ | 8.000000000000  | +------------------------------------------+

在这个例子中,通过innodb_buffer_pool_size设置为9克,innodb_buffer_pool_instances设置为16innodb_buffer_pool_chunk_size128米,为默认值。在这种情况下,9克不是的倍数innodb_buffer_pool_instances = 16innodb_buffer_pool_chunk_size = 128,所以通过innodb_buffer_pool_size调整为10克,是的倍数innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances

shell> mysqld——innodb-buffer-pool-size=9G——innodb-buffer-pool-instances=16
SELECT @@innodb_buffer_pool_size/1024/1024;+------------------------------------------+ | @@ 通过innodb_buffer_pool_size / 1024/1024/1024  | +------------------------------------------+ | 10.000000000000  | +------------------------------------------+
配置InnoDB缓冲池块大小

innodb_buffer_pool_chunk_size可以在1MB(1048576字节)的单位内增加或减少,但只能在启动时,在命令行字符串或MySQL配置文件中修改。

命令行:

Shell > mysqld——innodb-buffer-pool-chunk-size=134217728

配置文件:

(mysqld) innodb_buffer_pool_chunk_size = 134217728

更改时适用以下条件innodb_buffer_pool_chunk_size

  • 如果新的innodb_buffer_pool_chunk_size值*innodb_buffer_pool_instances大于初始化缓冲池时的当前缓冲池大小,innodb_buffer_pool_chunk_size被截断为通过innodb_buffer_pool_size/innodb_buffer_pool_instances

    例如,如果缓冲池初始化的大小为2 gb(2147483648字节)4缓冲池实例,块大小为1 gb(1073741824字节),块大小被截断为等于通过innodb_buffer_pool_size/innodb_buffer_pool_instances,如下所示:

    Shell——innodb-buffer-pool-size=2147483648——innodb-buffer-pool-instances=4——innodb-buffer-pool-chunk-size=1073741824;
    SELECT @@innodb_buffer_pool_size;+---------------------------+ | @@ 通过innodb_buffer_pool_size  | +---------------------------+ | 2147483648  | +---------------------------+ mysql >选择@@innodb_buffer_pool_instances;+--------------------------------+ | @@ innodb_buffer_pool_instances  | +--------------------------------+ | 4  | +--------------------------------+ # 块大小设置为1 gb(1073741824字节)启动,但通过innodb_buffer_pool_size / #截断innodb_buffer_pool_instances mysql >选择@@innodb_buffer_pool_chunk_size;+---------------------------------+ | @@ innodb_buffer_pool_chunk_size  | +---------------------------------+ | 536870912  | +---------------------------------+
  • 缓冲池大小必须总是等于或的倍数innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances.如果你改变innodb_buffer_pool_chunk_size通过innodb_buffer_pool_size是否自动调整为等于或的倍数的值innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances.调整发生在缓冲池初始化时。下面的例子演示了这种行为:

    #设置缓冲池的默认大小为128MB(134217728字节)+---------------------------+ | @@ 通过innodb_buffer_pool_size  | +---------------------------+ | 134217728  | +---------------------------+ # 块大小也是128 mb(134217728字节)mysql >选择@@innodb_buffer_pool_chunk_size;+---------------------------------+ | @@ innodb_buffer_pool_chunk_size  | +---------------------------------+ | 134217728  | +---------------------------------+ # 有一个缓冲池实例mysql >选择@@innodb_buffer_pool_instances;+--------------------------------+ | @@ innodb_buffer_pool_instances  | +--------------------------------+ | 1  | +--------------------------------+ # 块大小是下降了1 mb(1048576字节)在启动#(134217728 - 134217728 = 134217728):壳> mysqld——mysql >选择@@innodb_buffer_pool_chunk_size innodb-buffer-pool-chunk-size = 133169152;+---------------------------------+ | @@ innodb_buffer_pool_chunk_size  | +---------------------------------+ | 133169152  | +---------------------------------+ # 缓冲池大小从134217728增加到266338304 #缓冲池大小自动调整的值等于#或多个innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances mysql >选择@@innodb_buffer_pool_size;+---------------------------+ | @@ 通过innodb_buffer_pool_size  | +---------------------------+ | 266338304  | +---------------------------+

    这个例子演示了相同的行为,但是使用了多个缓冲池实例:

    #设置缓冲池的默认大小为2GB(2147483648字节)+---------------------------+ | @@ 通过innodb_buffer_pool_size  | +---------------------------+ | 2147483648  | +---------------------------+ # 块大小是5 GB(536870912字节)mysql >选择@@innodb_buffer_pool_chunk_size;+---------------------------------+ | @@ innodb_buffer_pool_chunk_size  | +---------------------------------+ | 536870912  | +---------------------------------+ # 有4个缓冲池实例mysql >选择@@innodb_buffer_pool_instances;+--------------------------------+ | @@ innodb_buffer_pool_instances  | +--------------------------------+ | 4  | +--------------------------------+ # 块大小是下降了1 mb(1048576字节)在启动#(536870912 - 536870912 = 536870912):壳> mysqld——mysql >选择@@innodb_buffer_pool_chunk_size innodb-buffer-pool-chunk-size = 535822336;+---------------------------------+ | @@ innodb_buffer_pool_chunk_size  | +---------------------------------+ | 535822336  | +---------------------------------+ # 缓冲池大小从2147483648增加到4286578688 #缓冲池大小自动调整的值等于#或多个innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances mysql >选择@@innodb_buffer_pool_size;+---------------------------+ | @@ 通过innodb_buffer_pool_size  | +---------------------------+ | 4286578688  | +---------------------------+

    更换时要小心innodb_buffer_pool_chunk_size,因为更改该值会增加缓冲池的大小,如上面的示例所示。在你改变之前innodb_buffer_pool_chunk_size,计算效果通过innodb_buffer_pool_size以确保生成的缓冲池大小是可接受的。

请注意

为了避免潜在的性能问题,块的数量(通过innodb_buffer_pool_size/innodb_buffer_pool_chunk_size)不宜超过1000个。

在线配置InnoDB缓冲池大小

通过innodb_buffer_pool_size配置选项可以使用语句,允许您在不重新启动服务器的情况下调整缓冲池的大小。例如:

SET GLOBAL innodb_buffer_pool_size=402653184;
请注意

缓冲池大小必须等于或的倍数innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances.更改这些变量设置需要重新启动服务器。

所执行的活动事务和操作InnoDBapi应该在调整缓冲池的大小之前完成。当初始化调整操作时,该操作直到所有活动事务完成后才启动。调整大小操作进行后,需要访问缓冲池的新事务和操作必须等待,直到调整大小操作完成。该规则的例外情况是,当缓冲池的大小减小时,在缓冲池进行碎片整理时允许对缓冲池的并发访问,并撤销页面。允许并发访问的一个缺点是,当页面被撤销时,它可能会导致可用页面暂时短缺。

请注意

如果嵌套事务在缓冲池调整操作开始后启动,则可能失败。

在线监控缓冲池调整进度

Innodb_buffer_pool_resize_status报告缓冲池调整进度。例如:

SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';+----------------------------------+----------------------------------+ | Variable_name |值  | +----------------------------------+----------------------------------+ | Innodb_buffer_pool_resize_status |也调整其他的哈希表。| +----------------------------------+----------------------------------+

缓冲池调整进度也记录在服务器错误日志中。这个例子显示了增加缓冲池大小时记录的注释:

[注]InnoDB:调整缓冲池大小从134217728到4294967296。(unit=134217728)[注]InnoDB:禁用自适应哈希索引。[注]InnoDB:缓冲池0:31块(253952块)被添加[注]InnoDB:缓冲池0:哈希表被调整大小。[注]InnoDB: lock_sys调整哈希表大小,自适应哈希索引,字典。[注]InnoDB:完成调整缓冲池大小从134217728到4294967296。[注]InnoDB:重新启用自适应哈希索引。

这个例子显示了在减少缓冲池大小时记录的注释:

[注释]InnoDB:调整缓冲池大小从4294967296到134217728。(unit=134217728)[注]InnoDB:禁用自适应哈希索引。[注]InnoDB:缓冲池0:开始提取最后的253952块。[注]InnoDB:缓冲池0:从空闲列表中退出253952块。试图重新定位0个页面。(253952/253952)[注]InnoDB:缓冲池0:退出目标253952块。[注]InnoDB:缓冲池0:31块(253952块)被释放。[注]InnoDB:缓冲池0:哈希表被调整大小。[注]InnoDB: lock_sys调整哈希表大小,自适应哈希索引,字典。[注]InnoDB:完成缓冲池大小从4294967296调整到134217728。 [Note] InnoDB: re-enabled adaptive hash index.
在线缓冲池调整内部大小

调整大小的操作由后台线程执行。当增加缓冲池的大小时,resizing操作:

  • 添加页面(块大小由innodb_buffer_pool_chunk_size

  • 转换散列表、列表和指针以使用内存中的新地址

  • 将新页添加到空闲列表中

当这些操作进行时,其他线程将被阻止访问缓冲池。

当减少缓冲池的大小时,调整大小操作:

  • 对缓冲池进行碎片整理并提取(释放)页面

  • 中删除页面(块大小由innodb_buffer_pool_chunk_size

  • 转换散列表、列表和指针以使用内存中的新地址

在这些操作中,只有对缓冲池进行碎片整理和提取页面才允许其他线程并发访问缓冲池。