InnoDB存储引擎---checkpoint

Buffer Pool 的设计就是为了协调 CPU 和磁盘速度之间的鸿沟。因此页的操作都是先在 Buufer Pool 中完成的。

     例如,客户端发来一条 DML ,首先在 Buufer Pool 中的页上更改,这时就会导致一个问题,Buufer Pool 中的该数据“版本”比磁盘中的数据“新”,而我们肯定以磁盘中的数据为准(最终数据也要写到磁盘中去),因此,将这时在 Buffer Pool 中的页称为“dirty page(脏页)”    

    如果 buffer pool 中没有该页,则就走正常的查询路线(解析器、优化器),将“结果页”放到 buffer pool 的 LRU 列表中,然后再更改这个页。再将其刷到磁盘中。

    checkpoint 可以看做一种“指针”,主要作用是将缓冲池中的脏页刷到磁盘,区别就是刷多少到磁盘中。InnoDB 中通过 LSN(Log Sequence Number)来标记版本,LSN 8字节,即32位,而每个页默认是16KB ,因此2^32 * 16KB=64TB,这也就解释了 InnoDB 的单表大小最大为64TB。

innodb 中的 checkpoint 分为两种:
sharp checkpoint:在数据即将关闭的时候将buffer pool中的所有脏页刷到磁盘中,这是默认的工作方式(innodb_fast_shutdown=1)
fuzzy checkpoint:刷一部分脏页到磁盘中
master thread checkpoint
flush_lru_list checkpoint
    async/sync flush checkpoint:
    将已经写入到重做日志的 LSN 记为 redo_lsn,将已经刷到磁盘的最新 LSN 记为checkpoint_lsn,定义:
    checkpoint_age = redo_lsn - checkpoint_lsn
    再定义:
    async_water_mark = 75% * total_redo_log_file_size
    sync_water_mark = 90% * total_redo_log_file_size

    checkpoint_age < async_water_mark 时不需要刷脏页到磁盘;
    async_water_mark < checkpoint_age < sync_water_mark 时刷脏页到磁盘,直到 checkpoint_age < async_water_mark ;

dirty page too much checkpoint(脏页数量过多):

                其目的是保证缓冲池中有足够多的可用页,其参数由 innodb_max_dirty_pages_pct 控制。








innodb_buffer_pool_size --> innodb_log_buffer_size --> redo log(flush disk)
checkpoint 控制  innodb_flush_log_at_trx_commit 控制




猜你喜欢

转载自blog.csdn.net/qq_19558795/article/details/80053208