void master_thread(){
goto loop;
loop:
for(int i=0;i<10;i++){
thread_sleep(1)//sleep 1 second
do log buffer flush to disk #重做日志缓冲刷新到重做日记文件
if(last_one_second_ios<5%innodb_io_capacity) #一秒内的IO次数小于innodb_io_capacity值的5%
do merge 5%innodb_io_capacity insert buffer #合并5%插入缓冲
if(buf_get_modified_ratio_pct>innodb_max_dirty_pages_pct) #缓冲池中脏页比例超过设定的innodb_max_dirty_pages_pct
do buffer pool flush 100%innodb_io_capacity dirty page #从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity
else if enable adaptive flush #如果开启innodb_adaptive_flushing自适应刷新
do buffer pool flush desired amount dirty page #刷新缓冲区所需数量的脏页,由desired amount dirty page决定
if(no user activity) #没有用户活动(数据库空闲)
goto backgroud loop #切换到background loop循环
}
if(last_ten_second_ios<innodb_io_capacity) #十秒内的IO操作小于innodb_io_capacity
do buffer pool flush 100%innodb_io_capacity dirty page #从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity
do merge 5%innodb_io_capacity insert buffer #合并5%插入缓冲
do log buffer flush to disk #重做日志缓冲刷新到重做日记文件
do full purge #删除无用的Undo页
if(buf_get_modified_ratio_pct>70%) #缓冲池中脏页比例大于70%
do buffer pool flush 100%innodb_io_capacity dirty page #从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity
else
do buffer pool flush 10%innodb_io_capacity dirty page #从缓冲区刷新脏页时,刷新脏页的数量为10%innodb_io_capacity
goto loop #跳回主循环
background loop: #跳转到background loop循环
do full purge #删除无用的Undo页
do merge 100%innodb_io_capacity insert buffer ##合并100%插入缓冲
if not idle: #无用户活动
goto loop: #跳回主循环
else:
goto flush loop #跳到flush loop
flush loop:
do buffer pool flush 100%innodb_io_capacity dirty page #从缓冲区刷新脏页时,刷新脏页的数量为10%innodb_io_capacity
if(buf_get_modified_ratio_pct>innodb_max_dirty_pages_pct) #缓冲池中脏页比例超过设定的innodb_max_dirty_pages_pct
go to flush loop
goto suspend loop #切换到suspend loop
suspend loop:
suspend_thread() #进程挂起
waiting event #等待事件
goto loop;
}
以上伪代码摘自《MySQL技术内幕:InnoDB存储引擎(第2版)》 — 姜承尧
新版本的InnoDB对于刷新脏页的操作,从Master Thread线程分离到一个单独的Page Cleaner Thread,从而减轻了Master Thread的工作,同时进一步提高了系统的并发性。其余工作原理不变。