From d689e044646b419d74b57f59c860bec01d3cee8b Mon Sep 17 00:00:00 2001 From: asahi Date: Mon, 25 Nov 2024 20:40:33 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BBmysql=20checkpoint=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/innodb体系结构.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/mysql/mysql文档/innodb体系结构.md b/mysql/mysql文档/innodb体系结构.md index f86d958..3aa8880 100644 --- a/mysql/mysql文档/innodb体系结构.md +++ b/mysql/mysql文档/innodb体系结构.md @@ -182,3 +182,23 @@ redo log buffer在如下场景下会被刷新到文件中: - 每个事务提交时都会将redo log buffer刷新到磁盘文件中 - 当redo log buffer剩余空间小于一般时,redo log buffer刷新到磁盘文件中 +## checkpoint +在innodb中,对数据页的修改都是在缓冲池中完成的,在对内存页进行修改后,内存页和磁盘上的页内容不一致,此时被称为`脏页`。 + +在存在脏页时,如果在脏页被刷新到磁盘时,数据库发生宕机,那么将会发生数据修改的丢失。为了解决该问题,innodb采用了`write ahead log`策略,即当事务提交时,先写redo log,再修改页。当发生数据丢失时,可以通过redo log来完成数据的修复。 + +checkpoint解决了如下问题: +- 缩短数据库恢复时间 +- 缓冲池不够用时,将脏页刷新到磁盘 +- redo log不可用时,刷新脏页 + +### 缩短数据库恢复时间 +通过checkpoint,数据库并不需要在宕机重启之后对所有日志执行redo操作,checkpoint之前的页都已经刷新到磁盘。故而,数据库只需要对checkpoint之后的数据执行redo操作即可。 + +### 缓冲池不够用 +当缓冲池不够用时,LRU会进行页面淘汰,此时,被淘汰的页如果是脏页,需要强制执行checkpoint,将脏页刷新到磁盘中。 + +### redo log不可用 +redo log类似循环队列,checkpoint之前的位置都已经被刷新到磁盘中,可以被覆盖使用。如果当redo log文件中所有的内容都未被刷新到磁盘中,那么此时会强制触发checkpoint。 + +