您可以配置InnoDB
脱机或服务器运行时缓冲池大小。本节描述的行为适用于这两种方法。有关在线配置缓冲池大小的其他信息,请参见在线配置InnoDB缓冲池大小.
增加或减少时通过innodb_buffer_pool_size
时,操作以块的形式执行。块大小由innodb_buffer_pool_chunk_size
配置选项,该选项的默认值为128米
.有关更多信息,请参见配置InnoDB缓冲池块大小.
缓冲池大小必须总是等于或的倍数innodb_buffer_pool_chunk_size
*innodb_buffer_pool_instances
.如果你配置通过innodb_buffer_pool_size
不等于或不等于的倍数的值innodb_buffer_pool_chunk_size
*innodb_buffer_pool_instances
,缓冲池大小自动调整为等于或的倍数innodb_buffer_pool_chunk_size
*innodb_buffer_pool_instances
.
在下面的例子中,通过innodb_buffer_pool_size
设置为8 g
,innodb_buffer_pool_instances
设置为16
.innodb_buffer_pool_chunk_size
是128米
,为默认值。
8 g
是有效的通过innodb_buffer_pool_size
价值的,因为8 g
是的倍数innodb_buffer_pool_instances = 16
*innodb_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
设置为16
.innodb_buffer_pool_chunk_size
是128米
,为默认值。在这种情况下,9克
不是的倍数innodb_buffer_pool_instances = 16
*innodb_buffer_pool_chunk_size = 128
,所以通过innodb_buffer_pool_size
调整为10克
,是的倍数innodb_buffer_pool_chunk_size
*innodb_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_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_size
*innodb_buffer_pool_instances
.如果你改变innodb_buffer_pool_chunk_size
,通过innodb_buffer_pool_size
是否自动调整为等于或的倍数的值innodb_buffer_pool_chunk_size
*innodb_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_buffer_pool_size
配置选项可以使用集
语句,允许您在不重新启动服务器的情况下调整缓冲池的大小。例如:
SET GLOBAL innodb_buffer_pool_size=402653184;
缓冲池大小必须等于或的倍数innodb_buffer_pool_chunk_size
*innodb_buffer_pool_instances
.更改这些变量设置需要重新启动服务器。
所执行的活动事务和操作InnoDB
api应该在调整缓冲池的大小之前完成。当初始化调整操作时,该操作直到所有活动事务完成后才启动。调整大小操作进行后,需要访问缓冲池的新事务和操作必须等待,直到调整大小操作完成。该规则的例外情况是,当缓冲池的大小减小时,在缓冲池进行碎片整理时允许对缓冲池的并发访问,并撤销页面。允许并发访问的一个缺点是,当页面被撤销时,它可能会导致可用页面暂时短缺。
如果嵌套事务在缓冲池调整操作开始后启动,则可能失败。
的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
)转换散列表、列表和指针以使用内存中的新地址
在这些操作中,只有对缓冲池进行碎片整理和提取页面才允许其他线程并发访问缓冲池。