17.8.3.6 缓冲池状态的保存和恢复
为了缩短服务器重启后暖启动期,InnoDB
在服务器关闭时将缓冲池中最近使用的页面的一部分保存,并在服务器启动时恢复这些页面。保存最近使用的页面百分比由innodb_buffer_pool_dump_pct
配置选项定义。
在重启一个繁忙服务器后,通常会出现暖启动期,随着时间的推移,系统性能不断提高,因为缓冲池中的磁盘页面被重新加载(当数据被查询、更新等时)。能够在启动时恢复缓冲池状态可以缩短暖启动期,因为不需要等待 DML 操作访问相应行,而是可以立即重新加载磁盘页面。同时,I/O 请求可以批量处理,使得总体 I/O 加速。页面加载是在背景中进行的,不会延迟数据库启动。
除了在关闭和启动时保存和恢复缓冲池状态外,您还可以在服务器运行时保存和恢复缓冲池状态。例如,在稳定工作负载下达到稳定的性能后,可以保存缓冲池状态。在运行报告或维护作业时,也可以恢复之前的缓冲池状态,因为这些操作会将数据页面加载到缓冲池中,只有在这些操作中需要这些页面,或者在运行一些非典型工作负载时。
尽管缓冲池可以是多个GB的大小,但是InnoDB
将到磁盘保存的缓冲池数据非常小。只有必要的表空间ID和页ID,以便定位适当页的信息被保存到磁盘。这一信息来自INNODB_BUFFER_PAGE_LRU
INFORMATION_ 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;
在线保存和恢复缓冲池状态
要在 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_阶段事件表”。
-
启用
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%';
-
将当前缓冲池状态dump到文件中,启用
innodb_buffer_pool_dump_now
。mysql> SET GLOBAL innodb_buffer_pool_dump_now=ON;
-
检查缓冲池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
-
加载缓冲池,启用
innodb_buffer_pool_load_now
:mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
-
通过查询性能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 | +-------------------------------+----------------+----------------+
您也可以使用性能schema在启动时加载缓冲池的进度监控。例如,在使用innodb_ buffer_pool_load_at_startup
时,stage/innodb/buffer pool load
仪表和相关消费者必须在启动时启用。有关更多信息,请见第29.3节,“性能schema启动配置”。