From 864e4a3f43ffa60174562cc5391cb84f13fbf10a Mon Sep 17 00:00:00 2001 From: asahi Date: Mon, 2 Dec 2024 20:46:50 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BBmysql=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 | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/mysql/mysql文档/innodb体系结构.md b/mysql/mysql文档/innodb体系结构.md index 9ea9b5a..2ac91a3 100644 --- a/mysql/mysql文档/innodb体系结构.md +++ b/mysql/mysql文档/innodb体系结构.md @@ -208,11 +208,14 @@ LSN为Log Sequence Number,该值不断递增,代表了和`redo log`中操作 LSN在innodb内部被使用,用于`crash recovery`和管理缓冲池。LSN长度为8字节, +> 位于`checkpoint`之前的变更都已经被写入到磁盘中 + ### Fuzzy Checkpoint innodb中实现了fuzzy checkpoint机制,会基于小批量(small batches)来将buffer pool中的页刷新到磁盘中。`并不需要在一次batch中将buffer pool中的页都刷新到磁盘中,否则checkpoint过程会中断用户的sql语句处理`。 在`crash recovery`的过程中,innodb会查找已经写入到log file中的checkpoint,位于checkpoint之前的内容已经被全部写入到数据库的磁盘文件中,innodb会扫描checkpoint之后的内容,并且将log file中的修改都应用到数据库中。 +> 如果数据库事务发生宕机,且缓冲池中存在部分变更尚未被写入到磁盘,那么数据库实例重启之后,会查看redo log日志中位于`checkpoint`之后的内容,并且将`checkpoint`之后的变更写入到磁盘中。 ### checkpoint种类 innodb内部使用Fuzzy Checkpoint进行页的刷新,只会将一部分的脏页刷新到磁盘。 @@ -229,3 +232,24 @@ innodb中存在如下集中类型的fuzzy checkpoint: #### FLUSH_LRU_LIST_CHECKPOINT 在innodb中,需要保证LRU中有一定数量的空闲页,如果空闲页少于该数量,那么innodb会将位于LRU尾端的页面淘汰。如果被淘汰页中存在脏页,那么对这些脏页需要执行checkpoint操作。 +`flush_lru_list_checkpoint`操作在单独的page cleaner线程中被执行,可以通过`innodb_lru_scan_depth`来控制lru中可用页的数量,该值默认为`1024`。 + +#### Async/Sync Flush Checkpoint +定义如下变量: +``` +checkpoint_age = redo_lsn - checkpoint_lsn +async_water_mark = 0.75 * total_redo_log_file_size +sync_water_mark = 0.9 * total_redo_log_file_size +```` + +假设定义了2个redo log文件,并且每个文件大小为1G,那么`total_redo_log_file_size`的大小为2G. + +那么,`async_water_mark`为`1.5G`,`sync_water_mark`为`1.8G`. + +- 当`checkpoint_age < async_water_mark`时,不需要触发任何刷新操作 +- 当`async_water_mark < checkpoint_age < sync_water_mark`时,触发`async flush`,从flush列表中刷新`足够`的脏页回磁盘 + > 刷新足够脏页回磁盘,是指刷新后满足`checkpoint_age < sync_water_mark` +- `checkpoint_age > sync_water_mark`,会触发`sync_water_mark`,刷新足够的脏页回磁盘 + +`sync/async flush checkpoint`操作同样放入到了page cleaner线程中,不会阻塞用户操作 +