MySQL中ib_buffer_pool文件的语义

时间:2017-01-21 21:51:22

标签: mysql innodb

MySQL的默认存储引擎InnoDB维护着一个数据库页面的内部缓冲池。在较新版本的MySQL(例如5.7+)中,缓冲池中页面的空间和页面ID在“ib_buffer_pool”文件中持久保存到磁盘。

我很好奇这个文件是如何构建的,而且特别是如果缓冲池中页面的相对年轻/旧版在重新启动时仍然存在。换句话说,如果池中的某些页面比其他页面更年轻,文件写入后会保持该关系,然后从磁盘中读取?

更广泛的问题如下:重启后InnoDB缓冲池的状态有多大?

1 个答案:

答案 0 :(得分:1)

你问的大部分内容并不重要。

该文件包含指针,而不是数据块。每个"指针"可能包含表空间id(ibdata1与单个.ibd文件)和块号。这将是方便的,但不一定非必要包括LRU信息。

目标是快速重新填充基于RAM的"缓冲池"重启后。缓冲池是缓存;在过去根本没有重新加载。在正常活动期间,缓冲池中的块基于(稍微)最近最少使用的"来组织。这有助于防止过早出现阻塞"。

如果在关闭之前所有块指针都存储在该文件中,则缓冲池可以恢复到原来的位置。在重新启动时,这需要一些磁盘活动,但在此之后,每个查询应该与没有重新启动时一样快。

如果由于某种原因,一些块被不适当地重新加载,那将是一个轻微的性能损失,但没有什么会错误的"。该块将很快被缓冲出缓冲池。

重启后有多少状态持续存在?嗯,绝对要求是保持数据库中数据的完整性 - 即使在电源故障时也是如此。除此之外的任何事情都只是性能优化。因此,要完全回答这个问题,需要了解iblog *(崩溃后需要;干净关闭后不需要),新的tmp表文件(不需要),"双缓冲区" (用于从突然崩溃后的页面中恢复过来)等等。