做外贸网站放在中国好还是美国好买卖友链
4.5 撕裂的页面
目录
4.5 撕裂的页面
4.5.1 双写缓冲区的作用
4.5.2 双写缓冲区的结构
4.5.3 双写缓冲区与Redolog的协同工作流程
4.5.2 双写缓冲区写入时机
4.5.3 禁用双写缓冲区
4.5.4 小结
未完待续...
上文我们学习了redo log的结构和其工作原理,它是一个记录物理逻辑的日志,描述了数据库记录的逻辑变化,用于崩溃恢复。但是读者是否进一步想过:从数据库层到硬件层还有操作系统层,每一层操作数据读写的最小颗粒都存在差异,所以就会导致一个问题,当数据库正在将一个数据页从缓冲池(buffer pool)写入磁盘时,如果在这个过程中发生崩溃(如操作系统崩溃或硬件故障),可能会导致只有这个页的一部分被写入。这就是所谓的部分写入,它会破坏页的完整性,从而导致数据损坏。那么怎么办呢?
4.5.1 双写缓冲区的作用
为了解决这个问题,InnoDB引入了双写缓冲区。用来加强数据完整性和恢复能力。其核心目的是防止在数据库崩溃时出现部分写入,也就是说,当数据库正在写入一个页到磁盘,但因为崩溃导致操作只完成了一部分,这个页可能会损坏。它的出现避免了这种情况的发生。从逻辑上来讲,双写缓冲区可以分为两个主要部分:内存中的双写缓冲区和磁盘上的双写缓冲区。
- 内存中的双写缓冲区: 在内存中,双写缓冲区不是一个单独的结构,而是缓冲池(Buffer Pool)的一部分。当页被修改,它们变成脏页并存储在缓冲池中。在这些页被写回磁盘之前,页的副本会被创建并存储在内存的双写区域。这样做是为了在写入操作期间如果发生崩溃,可以从双写缓冲区中的副本恢复数据。
- 磁盘上的双写缓冲区: 在磁盘上,双写缓冲区是共享表空间(例如ibdata1文件)中的一个特定区域。逻辑上,它被分成两个部分,每一部分足够容纳一定数量的连续InnoDB页的副本。磁盘上的双写缓冲区通常是连续的,以减少磁盘I/O操作的开销。
当InnoDB需要将缓冲池中的脏页刷新到磁盘时,它会执行以下步骤:
- 写入双写缓冲区: InnoDB首先将脏页的副本写入内存中的双写结构,然后再将这些内存中的副本写入磁盘上的双写缓冲区。
- 写入最终位置: 一旦磁盘上的双写缓冲区包含了脏页的副本,