Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Saving and Restoring the Buffer Pool State

17.8.3.6 保存和恢复缓冲池状态

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

在重新启动繁忙服务器后,通常会出现热身期,随着磁盘页面被重新加载到内存中(随着相同的数据被查询、更新等)。在启动时恢复缓冲池状态可以缩短热身期,通过重新加载磁盘页面,而不是等待 DML 操作访问相应的行。另外,I/O 请求可以批量执行,总体 I/O 更快。页面加载发生在后台,不会延迟数据库启动。

除了在关闭时保存缓冲池状态和在启动时恢复外,还可以在服务器运行时随时保存和恢复缓冲池状态。例如,可以在达到稳定的吞吐量下保存缓冲池状态,或者在运行报告或维护作业后恢复之前的缓冲池状态,这些作业将数据页面带入缓冲池中,仅供这些操作使用。

尽管缓冲池可以很大,但 InnoDB 保存到磁盘的缓冲池数据非常小。仅保存表空间 ID 和页面 ID,以定位适当的页面。这些信息来自 INNODB_BUFFER_PAGE_LRU INFORMATION_SCHEMA 表。默认情况下,表空间 ID 和页面 ID 数据保存在名为 ib_buffer_pool 的文件中,该文件保存在 InnoDB 数据目录中。文件名和位置可以使用 innodb_buffer_pool_filename 配置参数修改。

因为数据被缓存在缓冲池中,并且随着数据库操作而被老化,所以如果磁盘页面最近被更新,或者 DML 操作涉及尚未加载的数据,那么加载机制将跳过请求的页面。

底层机制涉及一个后台线程,用于执行 dump 和 load 操作。

压缩表的磁盘页面以压缩形式加载到缓冲池中。在 DML 操作期间访问页面内容时,页面将被解压缩。因为解压缩页面是一个 CPU 密集型过程,因此在连接线程中执行该操作比在单个线程中执行缓冲池恢复操作更高效。

与保存和恢复缓冲池状态相关的操作在以下主题中描述:

配置缓冲池页面的转储百分比

在从缓冲池中转储页面之前,您可以通过设置innodb_buffer_pool_dump_pct选项来配置要转储的最 recently used 缓冲池页面的百分比。如果您计划在服务器运行时转储缓冲池页面,可以动态配置该选项:

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% 的最 recently used 页面)。

在关闭时保存缓冲池状态并在启动时恢复

要在服务器关闭时保存缓冲池状态,请在关闭服务器之前发出以下语句:

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默认情况下启用。

在线保存和恢复缓冲池状态

要在线保存缓冲池状态,请发出以下语句:

SET GLOBAL innodb_buffer_pool_dump_now=ON;

要在线恢复缓冲池状态,请发出以下语句:

SET GLOBAL innodb_buffer_pool_load_now=ON;
显示缓冲池转储进度

要显示缓冲池状态转储到磁盘的进度,请发出以下语句:

SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';

如果操作尚未开始,“not started”将被返回。如果操作已完成,将打印完成时间(例如 Finished at 110505 12:18:02)。如果操作正在进行中,将提供状态信息(例如 Dumping buffer pool 5/7, page 237/2873)。

显示缓冲池加载进度

要显示缓冲池加载进度,请发出以下语句:

SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

如果操作尚未开始,“not started”将被返回。如果操作已完成,将打印完成时间(例如 Finished at 110505 12:23:24)。如果操作正在进行中,将提供状态信息(例如 Loaded 123/22301 pages)。

中止缓冲池加载操作

要中止缓冲池加载操作,请发出以下语句:

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 |
    +-------------------------------+----------------+----------------+
Note

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