数据库恢复技术(事物、三种更新策略以及恢复策略)
数据库恢复所要达到的目标
- 1、希望尽可能的减少发生故障的次数。
作为数据库来说,我肯定是想尽可能的减少犯病的次数,最好就没有嘛。 - 2、在出现故障的时候,能够通过一些方式进行故障恢复。
比如说当我数据库正在访问的时候,突然停电了,这就可能导致数据库的内容不一致了。这里要涉及到数据库一致性
的内容,后面会用实例具体分析。
数据库为了达到目标的恢复策略
在说恢复策略之前我们先想一个问题——要想达到上面的目标,数据库要怎么去做呢?
首先是减少发生故障的次数,这方面主要是要加强数据库的数据规范和存取规范,相当于是要有规矩整个过程才能有条不紊不容易出错嘛,也容易理解。这个在后面的事务
中会有提及。
之后是关于故障恢复的问题,数据库肯定要做些什么才能帮助我们更好的恢复数据库,有以下两个方面的考察:
- 1、数据库要发现所有的故障。就算有的故障数据库处理不了,但是至少也得有个报错信息。
- 2、数据库要有冗余。这里的冗余指的是数据库的备份,和数据冗余要区分开来。
而数据库恢复策略,主要针对当数据库发现故障之后所做的应对策略。比如停电之后,重启数据库,数据库的重启动恢复
(后面会提到,这里可以简单理解成数据库的通过这个方式发现故障就行了)发现了故障,之后该怎么做,数据库对此有以下三种策略:
1、周期性转储
2、周期性转储+增量转储
3、周期性转储+日志
下面分别对这三种策略进行分析说明。
-
首先是周期性转储,简单点说,就是一段时间对数据库进行一次备份,这样当发生故障的时候就可以根据之前的备份对数据库进行恢复了。下面给张图方便理解。(灵魂画师(doge))
这里可以看出,虽然可以在备份点进行备份,但是从备份点到故障点中间的这一部分用户的操作就丢失了,这肯定不是我们所希望的。 -
那我们再来看看第二种策略,周期性转储+增量转储。这种策略在第一种策略基础上做了改进:记录了自从上次备份之后变化的那一部分的记录,也就是增量转储的部分。还是以下图为例:
增量转储也是周期性存储的,如果每时每刻都进行增量性转储是不现实的,代价很大。所以增量转储点到故障点之间依然有数据丢失的部分,虽然相较于单一的周期性转储来说优化了许多,但也仍有瑕疵。
当然无论是做什么事情,都是一个循序渐进的过程。前面的两种方式为我们后续想法的提出做了很好的铺垫:如果增量转储点能够每时每刻做,那不就可以使得增量转储点到故障点之间没有数据丢失了?
事实上雀氏如此。增量转储点是 你操作完之后,我才重新把你变化的部分记录,比如 你插入了两次数据,并让数据库做了相应改变之后,我才记录。如果数据库在你插入的过程中故障了,就恢复不了(因为没有记录,你之前的操作也丢失了,除非去手动恢复,不然数据库没有信息来源)。
那只要现在我把你每一步操作都先提前记录下来,放到一个非挥发性存储器
中(就类似硬盘这种断点之后数据不会丢失的存储器,像内存就是挥发性的)这样恢复的时候岂不是想怎么恢复就怎么恢复了。(为所欲为)
- 这样就提出了第三点:周期性转储+日志。这种方式在企业级的数据库中得到了广泛使用。日志(log)记录了自上次备份以