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

回顾

上个文章我们了解了:

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

CheckPoint

  • DML(Data Manipulation Language)语句

即数据操纵语句,用来查询、添加、更新、删除等,常用的语句关键字有:SELECT,INSERT,UPDATE,DELETE,MERGE,CALL,EXPLAIN PLAN,LOCK TABLE,包括通用性的增删改查。

  • 脏页处理

为了解决CPU与磁盘之间的速度鸿沟,InnoDB使用了内存来进行了一个缓冲,因此对于DML语句是在内存中先完成的。此时就会产生我们所说的脏页,即内存与文件系统的数据不一致。因此InnoDB要选定一个时机将这些脏页刷新到磁盘中。

  • 频繁地处理脏页容易引发性能问题

假设现在某个页发生了变化,InnoDB就执行脏页处理操作,那么这个操作是非常大的,我们知道生产环境中,每秒发生的DML语句是非常多的,因此如果频繁发生IO操作,整个数据库的性能将大打折扣。

  • 脏页处理引起的数据丢失

从内存往磁盘刷新脏页不仅仅耗费性能,同时也给持久化带来了挑战。如果从内存中往磁盘刷新数据的时候,磁盘宕机了怎么办?InnoDB作为事务数据库采用了Write Ahead Log策略:
当事务提交时,先写重做日志,再修改页。
所以当数据库发生宕机导致脏页的刷新丢失时,可以通过重做日志(redo log)来完成数据的恢复。这便是事务数据库中Durability(持久性)的保证。

  • CheckPoint

我们现在知道,redo log可以保证我们数据的持久性,但是由于数据库的数据增量往往是比较庞大的,而redo log不可能无限增长(内存昂贵,其次redo log 过大持久化的过程会非常漫长)。所以checkPoint技术就应运而生了,它就是用来判断何时进行脏页处理的.概况一下为:

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

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

InnoDB内置的两种CheckPoint

Sharp CheckPoint

关闭数据库时将所有的脏页进行处理,这是默认的工作方式。具体参数设置为: innodb_fast_shutdown=1

Fuzzy CheckPoint

这个是数据库运行时InnoDB处理脏页的行为。采用偏移量刷新的策略。它分几个场景:

  • 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.

checkpoint_age = redo_lsn-checkpoint_lsn.

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

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

例子说明:

定义每个重做日志的大小为1GB,定义了两份。此时
total_redo_log_file_size = 1GB * 2 = 2GB.
通过计算我们得知,
async_water_mark = 1.5GB;
sync_water_mark = 1.8GB.
此时会进入一个死循环,确保checkpoint_age<async_water_mark

checkpoint.png

1.2版本后,此动作交由Page Cleaner Thread去完成,不阻塞查询线程。

  • Ditry Page too much

脏页太多,强制执行CheckPoint.可通过innodb_max_dirty_pages_pct进行配置.

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352