阜阳手机网站建设,用户体验设计五要素,律师网站建设品牌,wordpress前台文章名词解释 脏页#xff1a;当内存数据页跟磁盘数据页内容不一致的时候#xff0c;我们称这个内存页为“脏页”。 干净页#xff1a;内存数据写入到磁盘后#xff0c;内存和磁盘上的数据页的内容就一致了#xff0c;称为“干净页”。 LSN#xff1a;称为日志的逻辑序列号(l… 名词解释 脏页当内存数据页跟磁盘数据页内容不一致的时候我们称这个内存页为“脏页”。 干净页内存数据写入到磁盘后内存和磁盘上的数据页的内容就一致了称为“干净页”。 LSN称为日志的逻辑序列号(log sequence number)在innodb存储引擎中lsn占用8个字节。LSN的值会随着日志的写入而逐渐增大。事务中更新操作会产生一个新的LSN。LSN不仅存在于redo log中还存在于数据页中。 刷脏刷脏Flush是指将内存中已被修改的数据块写回到持久化存储如磁盘的操作。 write poswrite pos指的是WAL中当前用于写入日志的位置指针 checkpointCheckpoint是数据库中周期性将内存中的修改数据页刷新到磁盘的操作以确保数据库的持久化和一致性。 为什么要刷脏
数据持久性数据一致性缓存管理保证系统性能
刷脏时机
checkpoint刷脏空闲时刷脏MySQL正常关闭时刷脏
空闲时刷脏
MySQL会在自认为系统“空闲”的时候或者当系统更新很频繁redo log很快就写满的情况下合理的定时进行刷脏
正常关闭时刷脏
MySQL 正常关闭的情况。这时候MySQL 会把内存的脏页都 flush 到磁盘上这样下次 MySQL 启动的时候就可以直接从磁盘上读数据启动速度会很快。
如果关闭的时候不刷脏启动的时候就需要去读redo log然后同步数据到磁盘这样启动速度会变慢
checkpoint机制
Redo Log可能会出现的问题
缓冲池不够用redo log写满了当数据库宕机时重新应用redo log
checkpoint机制可以解决上面的三个问题:
缓冲池不够用时将脏页刷新到磁盘redo log写满时将脏页刷新到磁盘缩短数据库恢复时间
缓冲池不够用时
当缓冲池中的空间无法存放新读取的页这个时候innodb就会进行页的淘汰。使用LRU算法将淘汰LRU链表尾部的页如果这个被释放的页时脏页就要强制执行checkpoint将脏页刷新到磁盘。
缩短数据库恢复时间
当数据库宕机时数据库不需要重做所有的日志因为checkpoint之前的页都已经刷新回磁盘了。所以数据库就只需要针对checkpoint后的redo log进行恢复就可以了这样就减少了恢复的时间。
redo log写满
日志组的概念
MySQL为了优化磁盘持久的开销会有一个组提交group commit机制每个innodb至少有一个重做日志文件组每个文件组下面至少有两个redo log文件事务日志组路径当前目录是指的MySQL数据目录为日志组目录 事务日志组中的事务文件的个数默认两个 日志组中每个重做日志的大小一致并且循环使用。单个文件默认大小是48M最大是512G最大值是组内文件的大小总和 所谓的redo log不可用就是就是所有redo file都写满的时候
InnoDB以环形方式写入数据到重做日志的: checkpoint每次刷新多少页到磁盘每次从哪里取脏页什么时间触发checkpoint
InnoDB存储引擎内部两种checkpoint分别为:
Sharp CheckpointFuzzy Checkpoint
Sharp Checkpoint强制落盘
Sharp Checkpoint发生在数据库关闭时将所有的脏页都刷新回磁盘这是默认的工作方式即参数innodb_fast_shutdown1。 不适用于数据库运行时的刷新。
Fuzzy Checkpoint模糊落盘
在数据库运行时InnoDB存储引擎内部采用Fuzzy Checkpoint只刷新一部分脏页。
几种发生Fuzzy Checkpoint的情况①MasterThread Checkpoint 异步刷新每秒或每10秒从缓冲池脏页列表刷新一定比例的页回磁盘。异步刷新即此时InnoDB存储引擎可以进行其他操作用户查询线程不会受阻。②FLUSH_LRU_LIST Checkpoint
BP中有脏页换出需要执行落盘 InnoDB存储引擎需要保证LRU列表中差不多有100个空闲页可供使用。在InnoDB 1.1.x版本之前用户查询线程会检查LRU列表是否有足够的空间操作。如果没有根据LRU算法溢出LRU列表尾端的页如果这些页有脏页需要进行checkpoint。因此叫flush_lru_list checkpoint。 InnoDB 1.2.x开始这个检查放在了单独的进程Page Cleaner中进行。好处1.减少master Thread的压力 2.减轻用户线程阻塞。 设置参数innodb_lru_scan_dept控制LRU列表中可用页的数量该值默认1024③Async/Sync Flush Checkpoint 指重做日志不可用的情况需要强制刷新页回磁盘此时的页时脏页列表选取的。 这种情况是保证重做日志的可用性说白了就是重做日志中可以循环覆盖的部分空间太少了换种说法就是极短时间内产生了大量的redo log。 接下来会有几个变量图解也不难仔细看看。 InnoDB存储引擎通过LSNLog Sequence Number来标记版本LSN是8字节的数字。每个页有LSN重做日志有LSNcheckpoint有LSN。写入日志的LSN:redo_lsn刷新回磁盘的最新页LSN:checkpoint_lsn 有如下定义: checkpoint_age redo_lsn - checkpoint_lsn async_water_mark 75% * total_redo_file_size sync_water_mark 90% * total_redo_file_size 刷新过程如下图所示 这里总结下来就是
当redo log超过75%小于90%就会执行异步落盘。当redo log超过90%就会执行同步落盘操作。回阻塞写操作。
④Dirty Page too much Checkpoint
脏页率超过75%执行落盘 即脏页太多强制checkpoint.保证缓冲池有足够可用的页。 参数设置innodb_max_dirty_pages_pct 75 表示当缓冲池中脏页的数量占75%时强制checkpoint。1.0.x之后默认75