• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 保存和恢复缓冲池状态

    为了减少重新启动服务器后的预热时间,请InnoDB在服务器关闭时为每个缓冲池保存最近使用的页面的百分比,并在服务器启动时恢复这些页面。存储的最近使用页面的百分比由innodb_buffer_pool_dump_pct配置选项定义。

    重新启动繁忙的服务器后,通常会有一个预热期,吞吐量会稳定增加,这是因为缓冲池中的磁盘页面被带回内存中(查询,更新相同数据等)。通过在重新启动之前重新加载缓冲池中的磁盘页面,而不是等待DML操作访问相应的行,可以在启动时还原缓冲池,从而缩短了预热时间。而且,可以批量执行I / O请求,从而使整体I / O更快。页面加载发生在后台,并且不会延迟数据库启动。

    除了在关闭时保存缓冲池状态并在启动时还原它之外,您还可以在服务器运行时随时保存和还原缓冲池状态。例如,在稳定的工作量下达到稳定的吞吐量后,可以保存缓冲池的状态。您还可以在运行报表或维护作业(将仅用于这些操作的数据页带入缓冲池)运行报告或维护作业之后,或在运行其他一些非典型工作负载之后,还原先前的缓冲池状态。

    即使缓冲池的大小可以为数GB,但InnoDB相比之下,保存到磁盘的缓冲池数据也很小。仅找到适当页面所需的表空间ID和页面ID被保存到磁盘。该信息来自表。默认情况下,表空间ID和页面ID数据保存在名为的文件中,该文件保存在数据目录中。可以使用配置参数来修改文件名和位置。INNODB_BUFFER_PAGE_LRUINFORMATION_SCHEMAib_buffer_poolInnoDBinnodb_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';
    

    如果操作尚未开始,则返回“未开始”。如果操作完成,则打印完成时间(例如,在110505 12:18:02完成)。如果正在进行操作,则将提供状态信息(例如,转储缓冲池5/7,第237/2873页)。

    显示缓冲池加载进度

    要在加载缓冲池时显示进度,请发出以下语句:

    SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';
    

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

    中止缓冲池装入操作

    要中止缓冲池装入操作,请发出以下语句:

    SET GLOBAL innodb_buffer_pool_load_abort=ON;
    

    使用性能架构监视缓冲池加载进度

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

    以下示例演示了如何启用stage/innodb/buffer pool load阶段事件工具和相关的使用者表来监视缓冲池加载进度。

    有关本示例中使用的缓冲池转储和加载过程的信息,请参见“保存和恢复缓冲池状态”。有关性能架构阶段事件工具和相关使用者的信息,请参见“性能架构阶段事件表”。

    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_history,和events_stages_history_long

      mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' 
             WHERE NAME LIKE '%stages%';
      
    3. 通过启用转储当前的缓冲池状态innodb_buffer_pool_dump_now

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

      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. 通过查询性能架构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必须在启动时启用仪器和相关的使用者。有关更多信息,请参见“性能架构启动配置”。