flush: 就是把內(nèi)存里的數(shù)據(jù)寫入磁盤的過程。
臟頁:當(dāng)內(nèi)存數(shù)據(jù)頁跟磁盤數(shù)據(jù)頁內(nèi)容不一致的時候。
干凈頁:內(nèi)存數(shù)據(jù)寫入到磁盤后,內(nèi)存和磁盤上的數(shù)據(jù)頁的內(nèi)容一致的時候。
臟頁和干凈頁都是在內(nèi)存中。
1、數(shù)據(jù)庫的flush場景
- 對應(yīng)的redo log日志滿了,系統(tǒng)會停止所有更新操作,把checkpoint往前推進(jìn),redo log日志留出空間繼續(xù)寫。
- 對應(yīng)的系統(tǒng)內(nèi)存不足,當(dāng)需要新的內(nèi)存頁,而內(nèi)存不夠用的時候,就要淘汰一些數(shù)據(jù)頁,空出內(nèi)存給別的數(shù)據(jù)頁使用。如果淘汰的是臟頁,就要先將臟頁寫到磁盤。InnoDB用緩沖池(buffer pool)管理內(nèi)存,緩沖池中的內(nèi)存頁有3種狀態(tài):
1、還沒有使用的
2、使用了并且是干凈頁
3、使用了并且是臟頁 - mysql系統(tǒng)空閑的時候,刷一點(diǎn)臟頁。
- mysql正常關(guān)閉的時候,mysql會把內(nèi)存的臟頁都flush到磁盤上。
2、InnoDB刷臟頁的控制策略
innodb_io_capacity <75%進(jìn)行參數(shù)設(shè)置,可以設(shè)置InnoDB刷臟頁的控制策略。
根據(jù)上述算得的 F1(M) 和 F2(N) 兩個值,取其中較大的值記為 R,之后引擎就可以按照 innodb_io_capacity 定義的能力乘以 R% 來控制刷臟頁的速度。
臟頁比例:Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total
mysql> select VARIABLE_VALUE into @a from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty'; select VARIABLE_VALUE into @b from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'; select @a/@b;
InnoDB刷臟頁速度策略:

測試磁盤隨機(jī)讀寫的命令:fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
redo log狀態(tài)圖:

更新和flush過程:
