为避免在重新启动服务器后出现漫长的预热期,特别是对于具有大型缓冲池 的实例,您可以在服务器关闭时保存缓冲池状态,并在服务器启动时将缓冲池恢复到相同状态。
重启繁忙的服务器后,通常会有一个吞吐量稳定增加的预热期,因为缓冲池中的磁盘页面被带回内存(因为查询、更新等相同的数据)。将缓冲池恢复到关闭前状态的能力通过重新加载重启前缓冲池中的磁盘页面而不是等待 DML 操作访问相应的行来缩短预热时间。此外,I/O 请求可以大批量执行,从而使整体 I/O 更快。页面加载发生在后台,不会延迟数据库启动。
除了在关闭时保存缓冲池状态并在启动时恢复它之外,您还可以在服务器运行时随时保存和恢复缓冲池状态。例如,您可以在稳定的工作负载下达到稳定的吞吐量后保存缓冲池的状态。您还可以在运行报告或维护作业后恢复先前的缓冲池状态,这些报告或维护作业将数据页带入缓冲池,这些操作只需要这些操作,或者在运行其他一些非典型工作负载后。
尽管缓冲池的大小可能达到数 GB,但InnoDB
相比之下,保存到磁盘的缓冲池数据却很小。只有定位适当页面所需的表空间 ID 和页面 ID 才会保存到磁盘。此信息来自
表格。默认情况下,表空间 ID 和页面 ID 数据保存在名为 的文件中
,该文件保存到
数据目录中。可以使用
配置参数修改文件名和位置。
INNODB_BUFFER_PAGE_LRU
INFORMATION_SCHEMA
ib_buffer_pool
InnoDB
innodb_buffer_pool_filename
因为与常规数据库操作一样,数据在缓冲池中缓存和老化,所以如果磁盘页面是最近更新的,或者如果 DML 操作涉及尚未加载的数据,则没有问题。加载机制会跳过不再存在的请求页面。
底层机制涉及一个后台线程,该线程被分派以执行转储和加载操作。
来自压缩表的磁盘页面以其压缩形式加载到缓冲池中。在 DML 操作期间访问页面内容时,页面将像往常一样解压缩。由于解压缩页面是一个 CPU 密集型过程,因此在连接线程中执行操作比在执行缓冲池还原操作的单个线程中执行操作更有效。
与保存和恢复缓冲池状态相关的操作在以下主题中描述:
要在服务器关闭时保存缓冲池的状态,请在关闭服务器之前发出以下语句:
SET GLOBAL innodb_buffer_pool_dump_at_shutdown=ON;
要在服务器启动时恢复缓冲池状态,请在启动服务器--innodb-buffer-pool-load-at-startup
时指定选项:
mysqld --innodb-buffer-pool-load-at-startup=ON;
要在 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';
或者:
SELECT variable_value FROM information_schema.global_status WHERE
variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS';
如果操作尚未开始,则返回“未开始”。如果操作完成,则打印完成时间(例如 Finished at 110505 12:18:02)。如果操作正在进行,则提供状态信息(例如转储缓冲池 5/7,第 237/2873 页)。
要在加载缓冲池时显示进度,请使用以下选项之一:
SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';
或者:
SELECT variable_value FROM information_schema.global_status WHERE
variable_name = 'INNODB_BUFFER_POOL_LOAD_STATUS';
如果操作尚未开始,则返回“未开始”。如果操作完成,则打印完成时间(例如 Finished at 110505 12:23:24)。如果操作正在进行中,则会提供状态信息(例如已加载 123/22301 页)。