关于checkpoint你可能不知道的事

时间:2022-07-23
本文章向大家介绍关于checkpoint你可能不知道的事,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

我们都知道,当用户修改了数据,数据页在内存中修改后并不是每次都刷新到磁盘上。checkpoint之前的数据页保证一定落盘了,这也代表这这部分redolog可以被覆盖了,checkpoint之后的之后的数据有可能落盘,也有可能没有落盘,所以在进行崩溃恢复时,checkpoint之后的日志还是需要被使用的。innodb会依据脏页的刷新情况,定期推进checkpoint,从而减少数据库崩溃恢复的时间。

checkpoint的作用

  • 缩短数据库的恢复时间
  • 缓冲池不够用时,将脏页刷新到磁盘
  • redolog不可用时,刷新脏页

关于redo log的生成情况分析

关于redo log生成情况可以通过show engine innodb statusG命令查看。

---
LOG
---
Log sequence number 25778620828
Log flushed up to   25778620828
Pages flushed up to 25778620828
Last checkpoint at  25778620819
0 pending log flushes, 0 pending chkp writes
16 log i/o's done, 0.00 log i/o's/second

1. Log sequence number,表示数据库开启到现在已经产生的日志量,即LSN,日志序列号,单位是字节,值越大,说明数据库更新越多。通过它可以计算日志的产生速度。

2. Log flushed up to,表示日志已经刷新到哪个点了,它的值>=LSN。

LSN - Log flushed up to表示log buffer中还有多少日志未刷新到磁盘。如果系统hang住了,可以通过LSN - Log flushed up to来看下是否是由于log buffer满了导致系统hang住了。一般情况下,如果超过30%的日志还没有刷新到日志文件中,就需要增大innodb_log_buffer_size的值。

3. Pages flushed up to,表示脏页已经刷到哪个点了,表示这之前的logfile里的日志可以被覆盖了。

2-3表示不可覆盖的脏页的量,如果它的值较小,说明Log flushed up to和Pages flushed up to的值比较接近,表示脏页刷的比较快,可以被覆盖的logfile就多。如果2-3的值大,表示脏页刷新的速度慢,能被覆盖的logfile就少。

4. Last checkpoint at,表示最后一次检查点的log位置。它的值表示系统启动时从哪个点去恢复,redo log做崩溃恢复时指定的起点。去做崩溃恢复时,终点是最新的一条logfile,起点就是checkpoint,记录的最早脏的点。

3-4表示checkpoint这个动作的跟进速度。值大表示需要提高checkpoint的跟进速度。

2-4表示崩溃后日志要恢复的量。

checkpoint的工作机制

checkpoint有两种方式,sharp checkpointfuzzy checkpoint

1. sharp checkpoint:完全检查点,数据库正常关闭时,会触发把所有的脏页都写入到磁盘上,这就是完全检查点,数据库正常运行过程中不会使用sharp checkpoint。

2. fuzzy checkpoint:模糊检查点,主要有以下四种情况:

  • master thread checkpoint:以每秒或者每十秒的速度从缓冲池的脏页列表中刷新一定比例的脏页回磁盘,这个过程是异步的,不会阻塞用户线程。
  • flush_lru_list checkpoint:通过参数 innodb_lru_scan_depth 控制LRU列表中可用页的数量,发生了这个checkpoint时,说明脏页写入速度过慢。
  • async/sync flush checkpoint:指的是重做日志不可用的情况。当重做日志不可用时, 如果不能被覆盖的脏页数量(2-3)达到 75%时,触发异步checkpoint。 不能被覆盖的脏页数量(2-3)达到90%时,同步并且阻塞用户线程,然后根据 flush 列表最早脏的顺序刷脏页。 当这个事件中的任何一个发生的时候,都会记录到errlog 中,一旦errlog出现这种日志提示,一定需要加大logfile的组数。
  • dirty page too much checkpoint:脏页太多时,也会发生强制写日志,会阻塞用户线程,由innodb_max_dirty_pages_pct参数(默认75%)控制。

小结

mysql数据库为了提高事务的操作效率,在事务提交之后并不会立即将修改后的数据写入磁盘,而是通过日志先行(write log ahead)的策略保证事务的持久性。对于脏页,则通过异步的方式刷新到磁盘上,MySQL则是采用了checkpoint技术实现了异步刷新脏页的目的。