我们都知道,当用户修改了数据,数据页在内存中修改后并不是每次都刷新到磁盘上。checkpoint之前的数据页保证一定落盘了,这也代表这这部分redolog可以被覆盖了,checkpoint之后的之后的数据有可能落盘,也有可能没有落盘,所以在进行崩溃恢复时,checkpoint之后的日志还是需要被使用的。innodb会依据脏页的刷新情况,定期推进checkpoint,从而减少数据库崩溃恢复的时间。
checkpoint的作用
关于redo log的生成情况分析
关于redo log生成情况可以通过show engine innodb status\G命令查看。
---
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 checkpoint和fuzzy checkpoint。
1. sharp checkpoint:完全检查点,数据库正常关闭时,会触发把所有的脏页都写入到磁盘上,这就是完全检查点,数据库正常运行过程中不会使用sharp checkpoint。
2. fuzzy checkpoint:模糊检查点,主要有以下四种情况:
小结
mysql数据库为了提高事务的操作效率,在事务提交之后并不会立即将修改后的数据写入磁盘,而是通过日志先行(write log ahead)的策略保证事务的持久性。对于脏页,则通过异步的方式刷新到磁盘上,MySQL则是采用了checkpoint技术实现了异步刷新脏页的目的。