保存和恢复缓冲池状态
为了减少重新启动服务器后的预热时间,请InnoDB
在服务器关闭时为每个缓冲池保存最近使用的页面的百分比,并在服务器启动时恢复这些页面。存储的最近使用页面的百分比由innodb_buffer_pool_dump_pct
配置选项定义。
重新启动繁忙的服务器后,通常会有一个预热期,吞吐量会稳定增加,这是因为缓冲池中的磁盘页面被带回内存中(查询,更新相同数据等)。通过在重新启动之前重新加载缓冲池中的磁盘页面,而不是等待DML操作访问相应的行,可以在启动时还原缓冲池,从而缩短了预热时间。而且,可以批量执行I / O请求,从而使整体I / O更快。页面加载发生在后台,并且不会延迟数据库启动。
除了在关闭时保存缓冲池状态并在启动时还原它之外,您还可以在服务器运行时随时保存和还原缓冲池状态。例如,在稳定的工作量下达到稳定的吞吐量后,可以保存缓冲池的状态。您还可以在运行报表或维护作业(将仅用于这些操作的数据页带入缓冲池)运行报告或维护作业之后,或在运行其他一些非典型工作负载之后,还原先前的缓冲池状态。
即使缓冲池的大小可以为数GB,但InnoDB
相比之下,保存到磁盘的缓冲池数据也很小。仅找到适当页面所需的表空间ID和页面ID被保存到磁盘。该信息来自表。默认情况下,表空间ID和页面ID数据保存在名为的文件中,该文件保存在数据目录中。可以使用配置参数来修改文件名和位置。INNODB_BUFFER_PAGE_LRU
INFORMATION_SCHEMA
ib_buffer_pool
InnoDB
innodb_buffer_pool_filename
因为数据像常规数据库操作一样被缓存到缓冲池中并从缓冲池中老化,所以如果磁盘页是最近更新的,或者DML操作涉及尚未加载的数据,则没有问题。加载机制会跳过不再存在的请求页面。
底层机制涉及一个调度执行转储和加载操作的后台线程。
压缩表中的磁盘页面以其压缩形式加载到缓冲池中。在DML操作期间访问页面内容时,页面将照常解压缩。因为解压缩页面是CPU密集型过程,所以并发在连接线程中执行操作要比在执行缓冲池还原操作的单个线程中执行操作更有效。
以下主题描述了与保存和还原缓冲池状态有关的操作:
- 配置缓冲池页面的转储百分比
- 在关闭时保存缓冲池状态,在启动时将其还原
- 在线保存和还原缓冲池状态
- 显示缓冲池转储进度
- 显示缓冲池加载进度
- 中止缓冲池装入操作
- 使用性能架构监视缓冲池加载进度
配置缓冲池页面的转储百分比
在从缓冲池中转储页面之前,可以通过设置innodb_buffer_pool_dump_pct
选项来配置要转储的最近使用的缓冲池页面的百分比。如果计划在服务器运行时转储缓冲池页面,则可以动态配置该选项:
SET GLOBAL innodb_buffer_pool_dump_pct=40;
如果计划在服务器关闭时转储缓冲池页面,请innodb_buffer_pool_dump_pct
在配置文件中进行设置。
[mysqld] innodb_buffer_pool_dump_pct=40
该innodb_buffer_pool_dump_pct
默认值是25(转储最近最常使用的页面的25%)。
在关闭时保存缓冲池状态,在启动时将其还原
要在服务器关闭时保存缓冲池的状态,请在关闭服务器之前发出以下语句:
SET GLOBAL innodb_buffer_pool_dump_at_shutdown=ON ;
innodb_buffer_pool_dump_at_shutdown
默认情况下启用。
要在服务器启动时恢复缓冲池状态,请在启动服务器时指定--innodb-buffer-pool-load-at-startup
选项:
mysqld --innodb-buffer-pool-load-at-startup=ON;
innodb_buffer_pool_load_at_startup
默认情况下启用。
在线保存和还原缓冲池状态
要在MySQL服务器运行时保存缓冲池的状态,请发出以下语句:
SET GLOBAL innodb_buffer_pool_dump_now=ON ;
要在MySQL运行时恢复缓冲池状态,请发出以下语句:
SET GLOBAL innodb_buffer_pool_load_now=ON ;
显示缓冲池转储进度
要在将缓冲池状态保存到磁盘时显示进度,请发出以下语句:
SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';
如果操作尚未开始,则返回“未开始”。如果操作完成,则打印完成时间(例如,在110505 12:18:02完成)。如果正在进行操作,则将提供状态信息(例如,转储缓冲池5/7,第237/2873页)。
显示缓冲池加载进度
要在加载缓冲池时显示进度,请发出以下语句:
SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';
如果操作尚未开始,则返回“未开始”。如果操作完成,则打印完成时间(例如,在110505 12:23:24完成)。如果操作正在进行中,则提供状态信息(例如,已加载的123/22301页)。
中止缓冲池装入操作
要中止缓冲池装入操作,请发出以下语句:
SET GLOBAL innodb_buffer_pool_load_abort=ON ;
使用性能架构监视缓冲池加载进度
您可以使用Performance Schema监视缓冲池加载进度。
以下示例演示了如何启用stage/innodb/buffer pool load
阶段事件工具和相关的使用者表来监视缓冲池加载进度。
有关本示例中使用的缓冲池转储和加载过程的信息,请参见“保存和恢复缓冲池状态”。有关性能架构阶段事件工具和相关使用者的信息,请参见“性能架构阶段事件表”。
启用
stage/innodb/buffer pool load
仪器:mysql>
UPDATE performance_schema.setup_instrumentsSET ENABLED = 'YES'WHERE NAME LIKE 'stage/innodb/buffer%';启用舞台活动消费表,其中包括
events_stages_current
,events_stages_history
,和events_stages_history_long
。mysql>
UPDATE performance_schema.setup_consumersSET ENABLED = 'YES'WHERE NAME LIKE '%stages%';通过启用转储当前的缓冲池状态
innodb_buffer_pool_dump_now
。mysql>
SET GLOBAL innodb_buffer_pool_dump_now=ON ;检查缓冲池转储状态,以确保操作已完成。
mysql>
SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status'\G *************************** 1. row *************************** Variable_name : Innodb_buffer_pool_dump_status Value : Buffer pool(s) dump completed at 150202 16 :38 :58通过启用
innodb_buffer_pool_load_now
以下内容来加载缓冲池:mysql>
SET GLOBAL innodb_buffer_pool_load_now=ON ;通过查询性能架构
events_stages_current
表,检查缓冲池加载操作的当前状态。该WORK_COMPLETED
列显示已加载的缓冲池页面数。该WORK_ESTIMATED
列以页为单位提供剩余工作的估计。mysql>
SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATEDFROM performance_schema.events_stages_current; +------------------------------- +---------------- +---------------- + | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED | +------------------------------- +---------------- +---------------- + | stage/innodb/buffer pool load | 5353 | 7167 | +------------------------------- +---------------- +---------------- +events_stages_current
如果缓冲池加载操作已完成,那么该表将返回一个空集。在这种情况下,您可以检查events_stages_history
表以参见完成事件的数据。例如:mysql>
SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATEDFROM performance_schema.events_stages_history; +------------------------------- +---------------- +---------------- + | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED | +------------------------------- +---------------- +---------------- + | stage/innodb/buffer pool load | 7167 | 7167 | +------------------------------- +---------------- +---------------- +
注意在启动时使用加载缓冲池时,还可以使用性能架构监视缓冲池的加载进度
innodb_buffer_pool_load_at_startup
。在这种情况下,stage/innodb/buffer pool load
必须在启动时启用仪器和相关的使用者。有关更多信息,请参见“性能架构启动配置”。