共计 2465 个字符,预计需要花费 7 分钟才能阅读完成。
自动写代码机器人,免费开通
InnoDB 的 Checkpoint 技术是什么?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是丸趣 TV 小编给大家带来的参考内容,让我们一起来看看吧!
一句话概括,Checkpoint 技术就是将缓存池中脏页在某个时间点刷回到磁盘的操作
遇到的问题?
都知道缓冲池的出现就是为了解决 CPU 与磁盘速度之间的鸿沟,免得我们在读写数据库时还需要进行磁盘 IO 操作。有了缓冲池后,所有的页操作首先都是在缓冲池内完成的。
如一个 DML 语句,进行数据 update 或 delete 操作时,此时改变了缓冲池页中的记录,此时因为缓冲池页的数据比磁盘的新,此时的页就叫做脏页。
不管怎样,总会后的内存页数据需要刷回到磁盘里,这里就涉及几个问题:
若每次一个页发生变化,就将新页的版本刷新到磁盘,那么这个开销是非常大的若热点数据集中在某几个页中,那么数据库的性能将变得非常差如果在从缓冲池将页的新版本刷新到磁盘时发生了宕机,那么数据就不能恢复了 Write Ahead Log(预写式日志)
WAL 策略解决了刷新页数据到磁盘时发生宕机而导致数据丢失的问题,它是关系数据库系统中用于提供原子性和持久性(ACID 属性中的两个)的一系列技术。
WAL 策略核心点就是
redo log,每当有事务提交时,先写入 redo log(重做日志),在修改缓冲池数据页,这样当发生掉电之类的情况时系统可以在重启后继续操作
WAL 策略机制原理
InnoDB 为了保证数据不丢失,维护了 redo log。在缓冲池的数据页修改之前,需要先将修改的内容记录到 redo log 中,并保证 redo log 早于对应的数据页落盘,这就是 WAL 策略。
当故障发生而导致内存数据丢失后,InnoDB 会在重启时,通过重放 redo log,将缓冲池数据页恢复到崩溃前的状态。
Checkpoint
按理说有了 WAL 策略,我们就可以高枕无忧了。但其问题点又出现在 redo log 上面:
redo log 不可能是无限大的,不能没完没了的存储我们的数据等待一起刷新到磁盘在数据库怠机恢复时,如果 redo log 太大的话恢复的代价也是非常大的
所以为了解决脏页的刷新性能,脏页应该在什么时间、什么情况下进行脏页的刷新就用到了 Checkpoint 技术。
Checkpoint 的目的
1、缩短数据库的恢复时间
当数据库怠机恢复时,不需要重做所有的日志信息。因为 Checkpoint 前的数据页已经刷回到磁盘了。只需要 Checkpoint 后的 redo log 进行恢复就好了。
2、缓冲池不够用时,将脏页刷新到磁盘
当缓冲池空间不足时,根据 LRU 算法会溢出最近最少使用的页,若此页为脏页,那么需要强制执行 Checkpoint,将脏页也就是页的新版本刷回磁盘。
3、redo log 不可用时,刷新脏页
如图 redo log 的不可用是因为当前数据库对其设计都是循环使用的,所以其空间并不是无限大。
当 redo log 被写满, 因为此时系统不能接受更新, 所有更新语句都会被堵住。
此时必须强制产生 Checkpoint 需要将 write pos 向前推进,推进范围内的脏页都需要刷新到磁盘
Checkpoint 的种类
Checkpoint 发生的时间、条件及脏页的选择等都非常复杂。
Checkpoint 每次刷新多少脏页到磁盘?
Checkpoint 每次从哪里取脏页?
Checkpoint 什么时间被触发?
面对上面的问题,InnoDB 存储引擎内部为我们提供了两种 Checkpoint:
Sharp Checkpoint
发生在数据库关闭时将所有的脏页都刷新回磁盘,这是默认的工作方式,参数 innodb_fast_shutdown=1
Fuzzy Checkpoint
InnoDB 存储引擎内部使用这种模式, 只刷新一部分脏页,而不是刷新所有的脏页回磁盘
FuzzyCheckpoint 发生的情况
Master Thread Checkpoint
差不多以每秒或每十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘。
这个过程是异步的,即此时 InnoDB 存储引擎可以进行其他的操作,用户查询线程不会阻塞
FLUSH_LRU_LIST Checkpoint
因为 LRU 列表要保证一定数量的空闲页可被使用,所以如果不够会从尾部移除页,如果移除的页有脏页,就会进行此 Checkpoint。
5.6 版本后,这个 Checkpoint 放在了一个单独的 Page Cleaner 线程中进行,并且用户可以通过参数 innodb_lru_scan_depth 控制 LRU 列表中可用页的数量,该值默认为 1024
Async/Sync Flush Checkpoint
指的是 redo log 文件不可用的情况,这时需要强制将一些页刷新回磁盘,而此时脏页是从脏页列表中选取的
5.6 版本后不会阻塞用户查询
Dirty Page too much Checkpoint即脏页的数量太多,导致 InnoDB 存储引擎强制进行 Checkpoint。
其目的总的来说还是为了保证缓冲池中有足够可用的页。
其可由参数 innodb_max_dirty_pages_pct 控制, 比如该值为 75,表示当缓冲池中脏页占据 75% 时,强制进行 CheckPoint
总结
因为 CPU 和磁盘间的鸿沟的问题,从而出现缓冲池数据页来加快数据库 DML 操作
因为缓冲池数据页与磁盘数据一致性的问题,从而出现 WAL 策略(核心就是 redo log)
因为缓冲池脏页的刷新性能问题,从而出现 Checkpoint 技术
InnoDB 为了提高执行效率,并不会每次 DML 操作都和磁盘交互进行持久化。而是通过 Write Ahead Log 先策略写入 redo log 保证事物的持久化。
对于事物中修改的缓冲池脏页,会通过异步的方式刷盘,而内存空闲页和 redo log 的可用是通过 Checkpoint 技术来保证的。
感谢各位的阅读!看完上述内容,你们对 InnoDB 的 Checkpoint 技术是什么大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注丸趣 TV 行业资讯频道。
向 AI 问一下细节
丸趣 TV 网 – 提供最优质的资源集合!