闪存数据库事务恢复优化

事务处理事数据库最独特的地方,事务操作可以保证数据库处理操作的原子性、一致性、隔离性和持久性,推动了数据库在商业领域的成功应用。

事务恢复时数据库支持事务的重要功能,可以保证数据的一致性和正确性,数据库在实际的运行过程中,会不可避免的发生各种故障,那么必须建立有效的事务恢复的措施。在闪存的数据库中,事务恢复有着天然的优势,因为闪存是异地更新,旧不是直接被覆盖,那么旧数据可以当初数据恢复的一个检查点。所以研究在面向闪存数据库上传统的事务恢复的优化是有价值的。

1、什么是数据库的事务和事务的恢复

数据库的事务是数据库管理系统执行过程中的一个逻辑单元,是由有限个操作构成的一个操作序列。
闪存数据库事务恢复优化_第1张图片

2、传统的事务恢复的常见方法

建立操作日志,即对每个更新写入操作,写入前先写日志,将日志持久化,那么当事务终止的时候,可以通过持久化的日志,进行一步步的撤销恢复操作,写入之前的原始数据,从而完成事务的回复。
闪存数据库事务恢复优化_第2张图片

基于影子页的恢复方法

这种方法在每次更新写入的实时,都写入到一个新的页,称为影子页,需要维护一个逻辑页到物理页的地址映射,首先将写入的数据从逻辑页映射到影子页,提交事务的时候将整个映射表持久化,然后回收之前的旧数据页。如果事务终止,那么此时简单的将影子页抛弃,然后把地址映射更新到之前的旧数据,既可以完成恢复。
闪存数据库事务恢复优化_第3张图片

3、两种不同的类型的事务恢复方法的应用场景

适用于存储介质为磁盘,

在这里插入图片描述

适用于存储介质为闪存

闪存数据库事务恢复优化_第4张图片

4、那么对于闪存数据库的事务恢复,目前有哪些常见的恢复方法,主要也是基于上述的两种事务恢复方法的优化,分别如下:

基于影子页

Transactional FTL
TxFlash
Flag Commit

基于日志恢复

IPL
OPL

基于日志+影子页的方法

HV-Recovery

下面对这6种方法进行具体的说明。

5、Transactional FTL

基本思想:

闪存数据库事务恢复优化_第5张图片
简单的思想,就是用FTL层的异地更新策略来完成事务恢复处理的操作,FTL层为不仅为生成存储管理设备提供读写操作,同时还可以提供事务操作的API。

具体的实现方法

闪存数据库事务恢复优化_第6张图片
闪存数据库事务恢复优化_第7张图片
在这里插入图片描述

优缺点:

在这里插入图片描述
首先对于事务的提交,还是要通过日志来记录,即提交日志,通过判断是否有提交日志,事务是否成功执行,其次,在终止日志的时候,去扫面所有的数据块,将逻辑页恢复到最近提交的是数据块上。

6、TxFlash

基本思想:

闪存数据库事务恢复优化_第8张图片
闪存数据库事务恢复优化_第9张图片
基本思想,也是在FTL层实现事务的提交和恢复逻辑,那么数据库的存储管理层直接调用API即可。

具体实现:

闪存数据库事务恢复优化_第10张图片
闪存数据库事务恢复优化_第11张图片

优缺点:

闪存数据库事务恢复优化_第12张图片
闪存数据库事务恢复优化_第13张图片

7、Flag Commit

基本思想:

闪存数据库事务恢复优化_第14张图片
基本思想比较简单,就是利用影子页技术写,同时对于事务提交的日志进行优化,不需要写入日志记录,只用在事务操作的影子页的OOB空间中写入标志位,通过标志位去判断是否已成功提交。

具体实现

在这里插入图片描述
闪存数据库事务恢复优化_第15张图片
闪存数据库事务恢复优化_第16张图片
闪存数据库事务恢复优化_第17张图片

CF缺点:

在这里插入图片描述

AFC算法

闪存数据库事务恢复优化_第18张图片

优点:

闪存数据库事务恢复优化_第19张图片

缺点:

闪存数据库事务恢复优化_第20张图片

8、IPL、OPL

基本思想:

在这里插入图片描述
闪存数据库事务恢复优化_第21张图片
闪存数据库事务恢复优化_第22张图片

具体实现:

闪存数据库事务恢复优化_第23张图片
在这里插入图片描述

缺点:

闪存数据库事务恢复优化_第24张图片

解决方法:

闪存数据库事务恢复优化_第25张图片

9、HV-Recovery

基本思想:

闪存数据库事务恢复优化_第26张图片
闪存数据库事务恢复优化_第27张图片

具体实现:

闪存数据库事务恢复优化_第28张图片
闪存数据库事务恢复优化_第29张图片
闪存数据库事务恢复优化_第30张图片

优缺点:

闪存数据库事务恢复优化_第31张图片

10、总结

传统的数据库的事务处理都是通过redo和undo完成的,前者完成事务失败的恢复,后者完成数据的回滚修改之前的数据。

虽然是记录日志,但是可以理解,传统的方法通过日志进行撤销回放之前的操作,还是会更新本地的重复写,举个例子,如果要执行回滚操作,那么会将之前undo日志记录的数据,在重写更新一遍,对于磁盘来说,这是没有问题的,但是对于闪存,实际旧数据没有擦除,完全是可以利用起来的。

传统的事务恢复都是通过这个两个日志记录完成,但是对于闪存日志的恢复方法 ,大量的日志小写问题对闪存的伤害太大,此时不能这么做,本章就是解释了如何解决传统数据库日志小写的问题,有的直接采用影子页的方法,去掉日志写的方法,有的通过编程的部分页方法,在闪存上部分写,解决上述的问题,还有的采用混合存储的方法,用影子页的方法进行更新。

总的来说,最后一种的方法看似是最好的,仍然利用现在日志的方法,但是同时更改了日志记录的方法,利用了闪存无效块的历史数据信息。

你可能感兴趣的:(闪存数据库)