为了缩短服务器重启后的预热时间,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';
如果操作尚未开始,则返回 “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)。
您可以使用 性能架构 监控缓冲池加载进度。
以下示例演示了如何启用 stage/innodb/buffer pool load
阶段事件仪器和相关消费者表以监控缓冲池加载进度。
有关本示例中使用的缓冲池转储和加载过程的信息,请参见 第 17.8.3.6 节,“保存和恢复缓冲池状态”。有关性能架构阶段事件仪器和相关消费者的信息,请参见 第 29.12.5 节,“性能架构阶段事件表”。
启用
stage/innodb/buffer pool load
仪器mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/buffer%';
启用阶段事件消费者表,包括
events_stages_current
、events_stages_history
和events_stages_history_long
。mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
通过启用
innodb_buffer_pool_dump_now
转储当前缓冲池状态。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
通过启用
innodb_buffer_pool_load_now
加载缓冲池mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
通过查询性能架构
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 节,“性能架构启动配置”。