MySQL的默认存储引擎InnoDB维护数据库页的内部缓冲池。在较新版本的MySQL (例如5.7+)中,缓冲池中页面的空间和页In被保存到"ib_buffer_pool“文件中的磁盘中。
我很好奇这个文件是如何构造的,尤其是如果缓冲池中的页的相对年轻/老的状态在重新启动时仍然存在的话。换句话说,如果池中的某个页面比其他页面年轻,那么在将文件写到磁盘然后从磁盘读取之后,这种关系会保持吗?
一个更广泛的问题是:,在重启过程中,InnoDB缓冲池的状态有多少会持续?
发布于 2017-01-22 02:08:53
你所要求的大部分都不重要。
该文件包含指针,而不是数据块。每个“指针”可能包含表空间id (ibdata1相对于单个.ibd文件)和块号。这将是方便,但不是绝对必要的包括LRU的信息。
目标是在重新启动后快速重新填充基于RAM的“缓冲池”。缓冲池是一个缓存;在过去是没有重新加载的。在正常活动期间,缓冲池中的块(在某种程度上)是根据“最近使用的最少”来组织的。这有助于防止“太快”地撞出一个街区。
如果在关闭之前,所有块指针都存储在该文件中,那么缓冲池就可以恢复到原来的状态。在重新启动时,这需要一些磁盘活动,但在此之后,每个查询的速度应该与重新启动没有发生的速度一样快。
如果,由于任何原因,某些块被不适当地重新加载,它将是一个轻微的性能打击,但没有什么是“错误的”。这个块很快就会从缓冲池中跳出来。
在重新启动过程中,状态持续了多少?绝对的要求是保持数据库中数据的完整性--即使是在停电的情况下。除此之外,任何事情都只是性能优化。因此,要完全回答这个问题,我们需要理解iblog* (崩溃后需要;在完全关闭后不需要)、新的tmp表文件(不需要)、“双缓冲区”(用于在突然崩溃后从‘撕破的页面’中恢复)等等。
https://stackoverflow.com/questions/41784947
复制相似问题