为了减少服务器重启后的热身期,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;
要在线保存缓冲池状态,请发出以下语句:
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)。
您可以使用性能模式监控缓冲池加载进度。
以下示例演示如何启用 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 节,“性能架构启动配置”。