#### 15.8.3.6 保存和恢复缓冲池状态

[](<>)[](<>)

为了减少[暖身](glossary.html#glos_warm_up)重启服务器后的一段时间，`InnoDB`在服务器关闭时为每个缓冲池保存一定百分比的最近使用的页面，并在服务器启动时恢复这些页面。存储的最近使用页面的百分比由[`innodb_buffer_pool_dump_pct`](innodb-parameters.html#sysvar_innodb_buffer_pool_dump_pct)配置选项。

重新启动繁忙的服务器后，通常会有一个吞吐量稳定增加的预热期，因为缓冲池中的磁盘页面被带回内存（因为查询、更新相同的数据等）。在启动时恢复缓冲池的能力通过重新加载在重新启动之前位于缓冲池中的磁盘页面而不是等待 DML 操作访问相应的行来缩短预热期。此外，I/O 请求可以大批量执行，从而使整体 I/O 更快。页面加载发生在后台，不会延迟数据库启动。

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

即使缓冲池的大小可以达到数 GB，但缓冲池中的数据`InnoDB`相比之下，保存到磁盘的数据很小。只有定位适当页面所需的表空间 ID 和页面 ID 才会保存到磁盘。该信息来源于[`INNODB_BUFFER_PAGE_LRU`](information-schema-innodb-buffer-page-lru-table.html) `INFORMATION_SCHEMA`桌子。默认情况下，表空间 ID 和页面 ID 数据保存在一个名为`ib_buffer_pool`，它被保存到`InnoDB`数据目录。文件名和位置可以使用[`innodb_buffer_pool_filename`](innodb-parameters.html#sysvar_innodb_buffer_pool_filename)配置参数。

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

底层机制涉及一个后台线程，该线程被调度以执行转储和加载操作。

压缩表中的磁盘页以其压缩形式加载到缓冲池中。在 DML 操作期间访问页面内容时，页面会像往常一样解压缩。因为解压缩页面是一个 CPU 密集型过程，所以并发在连接线程中执行操作比在执行缓冲池恢复操作的单个线程中更有效。

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

-   [配置缓冲池页面的转储百分比](innodb-preload-buffer-pool.html#innodb-preload-buffer-pool-dump-pct)

-   [在关闭时保存缓冲池状态并在启动时恢复它](innodb-preload-buffer-pool.html#innodb-preload-buffer-pool-offline)

-   [在线保存和恢复缓冲池状态](innodb-preload-buffer-pool.html#innodb-preload-buffer-pool-online)

-   [显示缓冲池转储进度](innodb-preload-buffer-pool.html#innodb-preload-buffer-pool-dump-progress)

-   [显示缓冲池加载进度](innodb-preload-buffer-pool.html#innodb-preload-buffer-pool-load-progress)

-   [中止缓冲池加载操作](innodb-preload-buffer-pool.html#innodb-preload-buffer-pool-abort-load)

-   [使用性能模式监控缓冲池加载进度](innodb-preload-buffer-pool.html#monitor-buffer-pool-load-performance-schema)

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

在从缓冲池中转储页面之前，您可以通过设置[`innodb_buffer_pool_dump_pct`](innodb-parameters.html#sysvar_innodb_buffer_pool_dump_pct)选项。如果您计划在服务器运行时转储缓冲池页面，您可以动态配置该选项：

```
SET GLOBAL innodb_buffer_pool_dump_pct=40;
```

如果您计划在服务器关闭时转储缓冲池页面，请设置[`innodb_buffer_pool_dump_pct`](innodb-parameters.html#sysvar_innodb_buffer_pool_dump_pct)在您的配置文件中。

```
[mysqld]
innodb_buffer_pool_dump_pct=40
```

这[`innodb_buffer_pool_dump_pct`](innodb-parameters.html#sysvar_innodb_buffer_pool_dump_pct)默认值为 25（转储 25% 的最近使用的页面）。

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

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

```
SET GLOBAL innodb_buffer_pool_dump_at_shutdown=ON;
```

[`innodb_buffer_pool_dump_at_shutdown`](innodb-parameters.html#sysvar_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`](innodb-parameters.html#sysvar_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';
```

如果操作尚未开始，则返回“未开始”。如果操作完成，则打印完成时间（例如 Finished at 110505 12:18:02）。如果操作正在进行，则提供状态信息（例如，转储缓冲池 5/7，第 237/2873 页）。

##### 显示缓冲池加载进度

要在加载缓冲池时显示进度，请发出以下语句：

```
SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';
```

如果操作尚未开始，则返回“未开始”。如果操作完成，则打印完成时间（例如 Finished at 110505 12:23:24）。如果操作正在进行中，则会提供状态信息（例如，已加载 123/22301 页）。

##### 中止缓冲池加载操作

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

```
SET GLOBAL innodb_buffer_pool_load_abort=ON;
```

##### 使用性能模式监控缓冲池加载进度

[](<>)[](<>)

您可以使用以下命令监控缓冲池加载进度[性能模式](performance-schema.html).

以下示例演示了如何启用`阶段/innodb/缓冲池负载`舞台事件工具和相关的消费者表来监控缓冲池加载进度。

有关此示例中使用的缓冲池转储和加载过程的信息，请参阅[第 15.8.3.6 节，“保存和恢复缓冲池状态”](innodb-preload-buffer-pool.html).有关 Performance Schema 阶段事件工具和相关使用者的信息，请参阅[第 27.12.5 节，“性能模式阶段事件表”](performance-schema-stage-tables.html).

1.  启用`阶段/innodb/缓冲池负载`仪器：

    ```
    mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES'
           WHERE NAME LIKE 'stage/innodb/buffer%';
    ```

2.  启用舞台事件消费者表，其中包括[`events_stages_current`](performance-schema-events-stages-current-table.html),[`events_stages_history`](performance-schema-events-stages-history-table.html)， 和[`events_stages_history_long`](performance-schema-events-stages-history-long-table.html).

    ```
    mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES'
           WHERE NAME LIKE '%stages%';
    ```

3.  通过启用转储当前缓冲池状态[`innodb_buffer_pool_dump_now`](innodb-parameters.html#sysvar_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`](innodb-parameters.html#sysvar_innodb_buffer_pool_load_now)：

    ```
    mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
    ```

6.  通过查询 Performance Schema 检查缓冲池加载操作的当前状态[`events_stages_current`](performance-schema-events-stages-current-table.html)桌子。这`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`](performance-schema-events-stages-current-table.html)如果缓冲池加载操作已完成，则 table 返回一个空集。在这种情况下，您可以检查[`events_stages_history`](performance-schema-events-stages-history-table.html)表以查看已完成事件的数据。例如：

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

笔记

在启动时加载缓冲池时，您还可以使用 Performance Schema 监控缓冲池加载进度[`innodb_buffer_pool_load_at_startup`](innodb-parameters.html#sysvar_innodb_buffer_pool_load_at_startup).在这种情况下，`阶段/innodb/缓冲池负载`仪器和相关的消费者必须在启动时启用。有关详细信息，请参阅[第 27.3 节，“性能模式启动配置”](performance-schema-startup-configuration.html).
