文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  保存和恢复缓冲池状态

17.8.3.6 保存和恢复缓冲池状态

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

重启繁忙的服务器后,通常会有一个吞吐量稳步增加的预热期,因为缓冲池中的磁盘页面被带回到内存中(因为查询、更新等操作访问了相同的数据)。在启动时恢复缓冲池的能力可以通过重新加载重启前缓冲池中的磁盘页面而不是等待 DML 操作访问相应的行来缩短预热时间。此外,I/O 请求可以分批执行,从而提高整体 I/O 速度。页面加载在后台进行,不会延迟数据库启动。

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

即使缓冲池的大小可以达到几 GB,但与之相比,InnoDB 保存到磁盘的缓冲池数据却很小。仅保存定位适当页面所需的表空间 ID 和页面 ID 到磁盘。此信息来自 INNODB_BUFFER_PAGE_LRU INFORMATION_SCHEMA 表。默认情况下,表空间 ID 和页面 ID 数据保存在名为 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;
使用性能模式监控缓冲池加载进度

您可以使用 性能模式 监控缓冲池加载进度。

以下示例演示如何启用 stage/innodb/buffer pool load 阶段事件工具和相关的使用者表来监控缓冲池加载进度。

有关此示例中使用的缓冲池转储和加载过程的信息,请参阅 第 17.8.3.6 节“保存和恢复缓冲池状态”。有关性能模式阶段事件工具和相关使用者的信息,请参阅 第 29.12.5 节“性能模式阶段事件表”

  1. 启用 stage/innodb/buffer pool load 工具

    mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' 
           WHERE NAME LIKE 'stage/innodb/buffer%';
  2. 启用阶段事件使用者表,其中包括 events_stages_currentevents_stages_historyevents_stages_history_long

    mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' 
           WHERE NAME LIKE '%stages%';
  3. 通过启用 innodb_buffer_pool_dump_now 来转储当前缓冲池状态。

    mysql> SET GLOBAL innodb_buffer_pool_dump_now=ON;
  4. 检查缓冲池转储状态,以确保操作已完成。

    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
  5. 通过启用 innodb_buffer_pool_load_now 来加载缓冲池

    mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
  6. 通过查询性能模式 events_stages_current 表来检查缓冲池加载操作的当前状态。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_current 表将返回一个空集。在这种情况下,您可以检查 events_stages_history 表以查看已完成事件的数据。例如

    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 |
    +-------------------------------+----------------+----------------+
注意

您还可以在使用 innodb_buffer_pool_load_at_startup 在启动时加载缓冲池时,使用性能模式监控缓冲池加载进度。在这种情况下,必须在启动时启用 stage/innodb/buffer pool load 工具和相关的使用者。有关详细信息,请参阅 第 29.3 节“性能模式启动配置”