doc: 阅读mysql文档
This commit is contained in:
@@ -331,13 +331,9 @@ checkpoint解决了如下问题:
|
|||||||
redo log类似循环队列,checkpoint之前的位置都已经被刷新到磁盘中,可以被覆盖使用。如果当redo log文件中所有的内容都未被刷新到磁盘中,那么此时会强制触发checkpoint。
|
redo log类似循环队列,checkpoint之前的位置都已经被刷新到磁盘中,可以被覆盖使用。如果当redo log文件中所有的内容都未被刷新到磁盘中,那么此时会强制触发checkpoint。
|
||||||
|
|
||||||
### LSN
|
### LSN
|
||||||
checkpoint代表的是`最后被写入到磁盘文件中的变更`,通过LSN来进行表示。
|
LSN(log sequence number)为日志序列号, 是一个全局单调递增的64位整数,`类似于innodb内部的逻辑时钟),是全局唯一的`。
|
||||||
|
|
||||||
LSN为Log Sequence Number,该值不断递增,代表了和`redo log`中操作记录相关的时间点。(LSN代表的时间点和事务的开始和结束时间并不相关,LSN可以处于一个或多个事务的中间)。
|
LSN随着redo log的不断产生而单调递增。当发生数据的修改时,会生成redo log,此时LSN也会增加。
|
||||||
|
|
||||||
LSN在innodb内部被使用,用于`crash recovery`和管理缓冲池。LSN长度为8字节,
|
|
||||||
|
|
||||||
> 位于`checkpoint`之前的变更都已经被写入到磁盘中
|
|
||||||
|
|
||||||
### Fuzzy Checkpoint
|
### Fuzzy Checkpoint
|
||||||
innodb中实现了fuzzy checkpoint机制,会基于小批量(small batches)来将buffer pool中的页刷新到磁盘中。`并不需要在一次batch中将buffer pool中的页都刷新到磁盘中,否则checkpoint过程会中断用户的sql语句处理`。
|
innodb中实现了fuzzy checkpoint机制,会基于小批量(small batches)来将buffer pool中的页刷新到磁盘中。`并不需要在一次batch中将buffer pool中的页都刷新到磁盘中,否则checkpoint过程会中断用户的sql语句处理`。
|
||||||
|
|||||||
@@ -107,5 +107,56 @@ redo log和 bin log日志写入磁盘的时机也有所不同:
|
|||||||
|
|
||||||
将`innodb_flush_log_at_trx_commit`参数设置为`0`或`2`虽然可以在一定幅度上提高性能,但是会丧失数据库的ACID特性。
|
将`innodb_flush_log_at_trx_commit`参数设置为`0`或`2`虽然可以在一定幅度上提高性能,但是会丧失数据库的ACID特性。
|
||||||
|
|
||||||
|
#### log block
|
||||||
|
在innodb中,redo都是以512字节的大小为单位进行存储的,即redo log buffer、redo log file都是以block的形式进行保存,block的大小为512字节。
|
||||||
|
|
||||||
|
##### block & atomic
|
||||||
|
若针对相同的页,redo log的大小大于512字节,那么其会被分割为多个block进行存储。且由于redo log block的大小和磁盘扇区相同,故而在将block时,无需使用double write机制,针对特定的block,起写入为原子的,要么写入成功要么写入失败,不会像页(page)一样存在dirty的情况。
|
||||||
|
|
||||||
|
redo log block中包含的内容除了日志本身外,还包含`log block header`和`log block tailer`内容。`log block header + log block content + log block tailer`合计占用512字节,其中,各部分大小如下:
|
||||||
|
- `log block header`: 12字节大小
|
||||||
|
- `log block content`: 492字节大小
|
||||||
|
- `log block tailer`: 8字节大小
|
||||||
|
|
||||||
|
如上所示,每个redo log block可实际存储的内容大小为492字节。
|
||||||
|
|
||||||
|
##### log block header
|
||||||
|
log block header大小为12字节,由如下部分组成:
|
||||||
|
- `LOG_BLOCK_HDR_NO`: 占用4字节
|
||||||
|
- `LOG_BLOCK_HDR_DATA_LEN`: 占用2字节
|
||||||
|
- `LOG_BLOCK_FIRST_REC_GROUP`: 占用2字节
|
||||||
|
- `LOG_BLOCK_CHECKPOINT_NO`: 占用4字节
|
||||||
|
|
||||||
|
###### `LOG_BLOCK_HDR_NO`
|
||||||
|
log buffer由log block所组成,可以将log buffer看作是log block的数组,故而,log block header中`LOG_BLOCK_HDR_NO`起代表当前block在buffer中的位置。
|
||||||
|
|
||||||
|
`LOG_BLOCK_HDR_NO`由于表示的是log buffer中的数组小标,故而可知`LOG_BLOCK_HDR_NO`其是递增的,并且可以循环使用。`LOG_BLOCK_HDR_NO`的大小为4字节,但是其首位用作`flush bit`,故而,其可表示的最大长度为`2^31 bytes = 2GiB`。
|
||||||
|
|
||||||
|
##### `LOG_BLOCK_HDR_DATA_LEN`
|
||||||
|
`LOG_BLOCK_HDR_DATA_LEN`大小为2字节,代表`log block`所占用的大小,当log block被写满时,该值为`0x200`,表示当前log block使用完`block`中所有的可用空间,即log block的大小为512字节。
|
||||||
|
|
||||||
|
##### `LOG_BLOCK_FIRST_REC_GROUP`
|
||||||
|
`LOG_BLOCK_FIRST_REC_GROUP`占用2个字节,表示log block中第一个日志所处的偏移量。
|
||||||
|
|
||||||
|
`LOG_BLOCK-FIRST_REC_GROUP`的取值可能存在如下场景:
|
||||||
|
- 该值大小和`LOG_BLOCK_HDR_DATA_LEN`相同,则代表当前block中`不包含新的日志`
|
||||||
|
|
||||||
|
下图表示`事务T1的重做日志占用762字节`,`事务T2的重做日志占用100字节`的场景。
|
||||||
|
|
||||||
|
<img alt="" class="has" src="https://i-blog.csdnimg.cn/blog_migrate/41c0ed462afe1e9d56e1e53f11175f9a.jpeg">
|
||||||
|
|
||||||
|
由于每个block中最多只能保存492字节的数据,故而T1事务的762字节需要分布在两个block中,第一个block保存492字节的数据,第二个block中保存剩余270字节的数据。
|
||||||
|
|
||||||
|
- 其中,左侧的block,其`LOG_BLOCK_FIRST_REC_GROUP`值为12,代表第一个record开始的位置紧接在log block header之后
|
||||||
|
- 而右侧的block,其`LOG_BLOCK_FIRST_REC_GROUP`的值为`12 + 270 = 282 bytes`。在存放第一条record之前,不仅有log block header对应的12字节,还有之前T1剩余日志的270字节
|
||||||
|
|
||||||
|
##### `LOG_BLOCK_CHECKPOINT_NO`
|
||||||
|
`LOG_BLOCK_CHECKPOINT_NO`占用4字节大小,代表log block最后被写入时的检查点第四字节的值。
|
||||||
|
|
||||||
|
LSN(log sequence number)为一个`全局唯一且单调递增的64位数字,当发生数据修改时,redo log内容会增加,此时LSN也会增加`。
|
||||||
|
|
||||||
|
CHECKPOINT则是一个LSN值,同样为64位整数,代表位于`CHECKPOINT`之前所有的修改已经被持久化到数据库中,`位于CHECKPOINT之前的redo log内容可以被安全的覆盖`。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user