MySQL

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

2020-08-19  本文已影响0人  AbstractCulture

回顾

上个文章我们了解了:

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

CheckPoint

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

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

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

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

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

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

InnoDB内置的两种CheckPoint

Sharp CheckPoint

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

Fuzzy CheckPoint

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

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去完成,不阻塞查询线程。

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

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

上一篇 下一篇

猜你喜欢

热点阅读