文章目录
  1. 主循环
  2. 后台循环
  3. 刷新循环
  4. 版本1.2.x之前的升级日志

先介绍InnoDB1.0.x版本之前的Master线程。

Master线程具有最高的线程优先级别,其内部由多个循环组成:主循环(loop)、后台循环(backgroup loop)、刷新循环(flush loop)、暂停循环(suspend loop),下面分别介绍。

主循环

其中有两大部分的操作——每秒的操作与每10秒的操作;

每秒的操作包括

  • 日志缓冲刷新到磁盘(即使该事务还未提交,总是):即使再大的事务,它提交的时间也很短。
  • 合并插入缓冲(可能):并非每秒都会发生,InnoDB存储引擎判断当前一秒内发生IO次数是否小于5次,若小于5次则InnoDB存储引擎认为当前IO的压力很小,可以执行合并插入缓冲的操作;
  • 至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能):并非每秒都会发生,InnoDB存储引擎判断当前缓冲池中的脏页所占比例是否超过配置文件中innodb_max_dirty_pages_pct这个参数,若超过,则进行此操作;
  • 若当前无用户活动,则切换到后台循环;

每10秒的操作包括

  • 刷新100个脏页到磁盘(可能):InnoDB存储引擎判断过去10秒内磁盘的IO操作是否小于200次,若小于200次则InnoDB存储引擎认为当前有足够的磁盘IO操作能力,就可以将100个脏页刷新到磁盘;
  • 合并至多5个插入缓冲(总是)
  • 将日志缓冲刷新到磁盘(总是)
  • 删除至多20个无用的Undo页(总是):即full purge操作,因为对表进行update、delete操作时,对应的行先标记为删除,但是还需要保留这些行的版本信息,在full purge过程中,InnoDB存储引擎判断当前事务系统中标记为删除的行是否可以删除,
  • 刷新100个或者10个脏页到磁盘(总是):InnoDB存储引擎判断缓冲池中脏页所占比例,若超过70%,则刷新100个脏页到磁盘,否则,刷新10个脏页到磁盘;

后台循环

后台循环执行以下操作:

  • 删除无用的UNDO页(总是)
  • 合并20个插入缓冲(总是)
  • 跳转到主循环(总是)
  • 不断刷新100个页直到符合条件(可能,在flush循环中完成)

刷新循环

若刷新循环中没有事件需要处理,InnoDB存储引擎会切换到suspend_loop中,将Master线程挂起,等待事件的发生。

小结:综上,Master线程的伪代码描述如下。

 

版本1.2.x之前的升级日志

  • 引入参数innodb_io_capacity表示磁盘IO的吞吐量,在合并插入缓冲时,合并插入缓冲的页数为innodb_io_capacity的5%;在从缓冲池刷新脏页时,刷新脏页的数量为innodb_io_capacity;
  • 将参数innodb_max_dirty_pages_pct从90%调整为75%;使得数据库恢复的时间缩短;
  • 引入参数innodb_adaptive_flushing(自适应刷新)控制每秒刷新脏页的数量;
  • 引入参数innodb_purge_batch_size控制每次full_purge回收UNDO页的数量;

版本1.2.x之后,刷新脏页的操作分离到单独的Page Cleaner线程中执行。