0
点赞
收藏
分享

微信扫一扫

[MySQL]浅谈InnoDB存储引擎(二)InnoDB是如何处理脏页的

书呆鱼 2021-12-29 阅读 78

回顾

  1. InnoDB的在内存中的缓冲池.
  2. 缓存淘汰算法midpoint insertion strategy.
  3. 压缩页的执行过程
  4. 脏页的定义
    接下来,我们来继续探险InnoDB存储引擎

CheckPoint

  • DML(Data Manipulation Language)语句
  • 脏页处理
  • 频繁地处理脏页容易引发性能问题
  • 脏页处理引起的数据丢失
  • CheckPoint
  • 缩短数据库的恢复时间。
  • 缓冲池内存紧张时,将脏页刷新到磁盘。
    内存紧张时,根据LRU算法会刷出最近最少未使用的页,如果此页是脏页,那么需要强制执行checkPoint.
  • redo log不可用时,刷新脏页.
    这个发生在宕机的时候,数据库需要进行数据恢复,通过记载的偏移量,对需要做脏页的数据进行处理。
    举个例子:
    现在数据库发生了宕机,redo log的size为100,有30条脏页以及被处理了,现在只需要处理剩下的70条。

这样一来,数据库宕机就只需要对checkPoint之后的redo log进行恢复即可,大大缩短了恢复时间。(这个思想可以参考Redis的Psync)。

InnoDB内置的两种CheckPoint

Sharp CheckPoint
Fuzzy CheckPoint
  • Master Thread CheckPoint.
    对于发生在Master Thread以每秒或者每10秒的速度对部分脏页进行刷新操作,异步,不会阻塞查询线程。

  • FLUSH_LRU_LIST CheckPoint
    用来保证LRU列表有100个以上的空闲页,如果此时发现没有足够的可用页,会进行LUR算法进行淘汰,如果淘汰的页中存在脏页,则强制刷新脏页。
    1.1的版本前,这个操作是会阻塞用户的查询线程。
    1.2后,此行为在新的Page Cleaner线程进行。
    用户可以使用innodb_lru_scan_depth对可用页进行设置,默认为1024

  • Async/Sync Flush CheckPoint
    redo log不可用的情况下,将脏页强制刷回磁盘。
    这里涉及两个关键变量:
    redo_lsn:重做日志的LSN.
    checkpoint_lsn:已经刷回磁盘的最新页LSN.

同时,还涉及两个mark变量.

async_water_mark = 75% * total_redo_log_file_size;
sync_water_mark = 90% * total_redo_log_file_size;

例子说明:

  • Ditry Page too much

举例: 当innodb_max_dirty_pages_pct = 75时,表示脏页超过75%强制执行CheckPoint.

举报

相关推荐

0 条评论