阅读mysql文档
This commit is contained in:
@@ -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线程中,不会阻塞用户操作
|
||||
|
||||
|
||||
Reference in New Issue
Block a user