14.8.3.6 保存和还原缓冲池状态

为了减少重新启动服务器后的warmup时间,InnoDB在服务器关闭时为每个缓冲池保存了最近使用页面的百分比,并在服务器启动时恢复了这些页面。 innodb_buffer_pool_dump_pct配置选项定义了最近使用页面的存储百分比。

重新启动繁忙的服务器后,通常会有一个预热期,吞吐量不断增加,这是因为缓冲池中的磁盘页被带回内存中(查询,更新相同数据等)。通过在重新启动之前重新加载缓冲池中的磁盘页面,而不是 awaitDML 操作访问相应的行,可以在启动时还原缓冲池,从而缩短了预热时间。另外,可以批量执行 I/O 请求,从而使整体 I/O 更快。页面加载发生在后台,并且不会延迟数据库启动。

除了在关闭时保存缓冲池状态并在启动时还原它之外,您还可以在服务器运行时随时保存和还原缓冲池状态。例如,在稳定的工作量下达到稳定的吞吐量后,可以保存缓冲池的状态。您还可以在运行报告或维护作业(将仅针对这些操作而返回的数据页带到缓冲池中)运行报 table 或维护作业之后,或在运行其他一些非典型工作负载之后,还原先前的缓冲池状态。

即使缓冲池的大小可以为数 GB,但InnoDB保存到磁盘的缓冲池数据相比还是很小。仅找到适当页面所需的 table 空间 ID 和页面 ID 被保存到磁盘。此信息来自INNODB_BUFFER_PAGE_LRU INFORMATION_SCHEMAtable。默认情况下,table 空间 ID 和页面 ID 数据保存在名为ib_buffer_pool的文件中,该文件保存在InnoDB数据目录中。可以使用innodb_buffer_pool_filename配置参数来修改文件名和位置。

因为像常规数据库操作一样,数据在缓冲池中缓存和老化,所以如果磁盘页是最近更新的,或者 DML 操作涉及尚未加载的数据,则没有问题。加载机制会跳过不再存在的请求页面。

底层机制涉及一个调度执行转储和装入操作的后台线程。

压缩 table 中的磁盘页面以其压缩形式加载到缓冲池中。在 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_at_shutdowninnodb_buffer_pool_load_at_startup时,MySQL 5.7 中的innodb_buffer_pool_dump_pct默认值已从 100(转储所有页面)更改为 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阶段事件工具和相关的使用者 table 来监视缓冲池加载进度。

有关此示例中使用的缓冲池转储和加载过程的信息,请参阅第 14.8.3.6 节“保存和恢复缓冲池状态”。有关 Performance Schema 阶段事件工具和相关使用者的信息,请参见第 25.12.5 节“性能架构阶段事件 table”

  • 启用stage/innodb/buffer pool load工具:
mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' 
       WHERE NAME LIKE 'stage/innodb/buffer%';
mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' 
       WHERE NAME LIKE '%stages%';
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
mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
  • 通过查询“性能模式events_stages_current”table 来检查缓冲池加载操作的当前状态。 WORK_COMPLETED列显示已加载的缓冲池页面数。 WORK_ESTIMATED列以页为单位提供剩余工作量的估算值。
mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED
       FROM performance_schema.events_stages_current;
+-------------------------------+----------------+----------------+
| EVENT_NAME                    | WORK_COMPLETED | WORK_ESTIMATED |
+-------------------------------+----------------+----------------+
| stage/innodb/buffer pool load |           5353 |           7167 |
+-------------------------------+----------------+----------------+

如果缓冲池加载操作已完成,则events_stages_currenttable 将返回一个空集。在这种情况下,您可以检查events_stages_historytable 以查看已完成事件的数据。例如:

mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED 
       FROM performance_schema.events_stages_history;
+-------------------------------+----------------+----------------+
| EVENT_NAME                    | WORK_COMPLETED | WORK_ESTIMATED |
+-------------------------------+----------------+----------------+
| stage/innodb/buffer pool load |           7167 |           7167 |
+-------------------------------+----------------+----------------+

Note

在启动时使用innodb_buffer_pool_load_at_startup加载缓冲池时,还可以使用性能架构监视缓冲池的加载进度。在这种情况下,必须在启动时启用stage/innodb/buffer pool load仪器和相关的使用者。有关更多信息,请参见第 25.3 节“性能架构启动配置”