MySQL 的默认存储引擎 InnoDB 维护着一个数据库页面的内部缓冲池。在较新版本的 MySQL(例如 5.7+)中,缓冲池中页面的空间和页面 ID 持久保存到磁盘的“ib_buffer_pool”文件中。
我很好奇这个文件是如何构建的,特别是如果缓冲池中页面的相对新旧度在重启后仍然存在。换句话说,如果池中的某些页面比其他页面更年轻,在将文件写入磁盘然后从磁盘读取之后,这种关系是否成立?
一个更广泛的问题如下:有多少 InnoDB 缓冲池的状态在重启后持续存在?
最佳答案
你问的大部分内容都无关紧要。
该文件包含指针,而不是数据 block 。每个“指针”可能包含表空间 ID(ibdata1 与单个 .ibd 文件)和 block 号。包含 LRU 信息会很方便,但并非绝对必要。
目标是在重启后快速重新填充基于 RAM 的“缓冲池”。缓冲池是一个缓存;过去是根本没有重新加载。在正常事件期间,缓冲池中的 block 是基于(某种程度上)“最近最少使用”来组织的。这有助于防止“过早”出 block 。
如果所有 block 指针 在关闭之前都存储在该文件中,那么缓冲池可以基本上恢复到原来的位置。在重新启动时,这需要一些磁盘事件,但在那之后,每个查询都应该像没有发生重新启动一样快。
如果,由于某种原因,一些 block 被不恰本地重新加载,这将是一个轻微的性能损失,但没有什么是“错误的”。该 block 很快就会被撞出缓冲池。
有多少状态在重启后仍然存在?嗯,绝对的要求是保持数据库中数据的完整性——即使是在电源故障的情况下。除此之外的任何事情都只是性能优化。因此,要完全回答这个问题,需要了解 iblog*(崩溃后需要;干净关机后不需要)、新的 tmp 表文件(不需要)、“双缓冲区”(用于从“损坏的页面”中恢复) '突然崩溃后)等
关于mysql - MySQL 中 ib_buffer_pool 文件的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41784947/