Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

17.8.3.6 缓冲池状态的保存和恢复

为了缩短服务器重启后暖启动期,InnoDB 在服务器关闭时将缓冲池中最近使用的页面的一部分保存,并在服务器启动时恢复这些页面。保存最近使用的页面百分比由innodb_buffer_pool_dump_pct配置选项定义。

在重启一个繁忙服务器后,通常会出现暖启动期,随着时间的推移,系统性能不断提高,因为缓冲池中的磁盘页面被重新加载(当数据被查询、更新等时)。能够在启动时恢复缓冲池状态可以缩短暖启动期,因为不需要等待 DML 操作访问相应行,而是可以立即重新加载磁盘页面。同时,I/O 请求可以批量处理,使得总体 I/O 加速。页面加载是在背景中进行的,不会延迟数据库启动。

除了在关闭和启动时保存和恢复缓冲池状态外,您还可以在服务器运行时保存和恢复缓冲池状态。例如,在稳定工作负载下达到稳定的性能后,可以保存缓冲池状态。在运行报告或维护作业时,也可以恢复之前的缓冲池状态,因为这些操作会将数据页面加载到缓冲池中,只有在这些操作中需要这些页面,或者在运行一些非典型工作负载时。

尽管缓冲池可以是多个GB的大小,但是InnoDB将到磁盘保存的缓冲池数据非常小。只有必要的表空间ID和页ID,以便定位适当页的信息被保存到磁盘。这一信息来自INNODB_BUFFER_PAGE_LRUINFORMATION_ SCHEMA表。默认情况下,这些信息保存在名为ib_buffer_pool的文件中,该文件保存在InnoDB数据目录中。文件名和位置可以使用innodb_buffer_pool_filename配置参数进行修改。

由于数据在缓冲池中被缓存和淘汰的过程与常规数据库操作相同,因此即使磁盘页最近更新,也无需担心。如果DML操作涉及尚未加载的数据,加载机制将跳过已不存在的页。

底层机制涉及一个背景线程,它负责执行dump和load操作。

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

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

配置缓冲池页面的dump百分比

在将缓冲池页面从缓冲池中dump之前,您可以通过设置innodb_buffer_pool_dump_pct选项来配置您想要dump的最近使用的缓冲池页面百分比。如果计划在服务器运行时dump缓冲池页面,可以动态地配置选项:

SET GLOBAL innodb_buffer_pool_dump_pct=40;

如果计划在服务器关闭时dump缓冲池页面,请将innodb_buffer_pool_dump_pct设置在您的配置文件中。

[mysqld]
innodb_buffer_pool_dump_pct=40

默认的innodb_buffer_pool_dump_pct值是25(dump最近使用的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;
显示缓冲池 Dump 进度

在将缓冲池状态保存到磁盘时,显示进度,可以执行以下语句:

SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';

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

显示缓冲池 Load 进度

在加载缓冲池时,显示进度,可以执行以下语句:

SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

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

取消缓冲池 Load 操作

取消缓冲池加载操作,可以执行以下语句:

SET GLOBAL innodb_buffer_pool_load_abort=ON;
使用 Performance Schema 监控缓冲池 Load 进度

您可以使用Performance Schema监控缓冲池加载进度。

以下示例演示了如何启用stage/innodb/buffer pool load阶段事件仪器和相关的消费者表,以监控缓冲池加载进度。

关于在本示例中使用的缓冲池dump和load过程,请见第17.8.3.6节,“保存和恢复缓冲池状态”。关于性能_schema_阶段事件仪器和相关消费者,请见第29.12.5节,“性能_schema_阶段事件表”

  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. 将当前缓冲池状态dump到文件中,启用innodb_buffer_pool_dump_now

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

    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. 通过查询性能chema的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

您也可以使用性能schema在启动时加载缓冲池的进度监控。例如,在使用innodb_ buffer_pool_load_at_startup时,stage/innodb/buffer pool load仪表和相关消费者必须在启动时启用。有关更多信息,请见第29.3节,“性能schema启动配置”