21/8/4 读书笔记 数据库恢复

21/8/4 读书笔记

数据库系统概论 数据库恢复

数据库恢复属于事务处理技术,其考虑如何将数据库从一个错误状态恢复到某一个已知的正确状态。

事务的概念

数据库系统中的事务是一系列数据库操作,且具有:

  • 原子性(Atomicity):事务中的操作要么全做要么一个都不做,不可分割
  • 一致性(Consistency):我们认为一个事务之前和之后都属于一致性状态,而事务期间属于非一致性状态。比如进行银行汇款事务,包括存与取,如果事务进行到一半,只存不取,此时数据库就处在一个非一致性状态。
  • 隔离性(Isolation):一个事务的执行不能影响另一个事务的执行,包括在并发情形下。
  • 持续性(Durability):一个事务一旦提交,其对数据库造成的改变应该是不可挽回的,任何其他操作不能撤销或更改它。

在SQL中,事务相关的语句有:

BEGIN TRANSACTION;
COMMIT;
ROLLBACK;

其中COMMIT会提交事务;ROLLBACK会显式地回滚事务,即撤销该事务已经进行的操作。

数据库故障

数据库的故障可以分为:

  • 事务故障:事务内部在发现可预期的异常时可以通过ROLLBACK来回滚;而面对非预期的异常时,比如数据库强制撤销事务、运算溢出等,此时也属于事务故障。事实上,事务故障更多地指这些非预期的异常,表明事务并没有运行到预期的重点(COMMIT或ROLLBACK)。
  • 系统故障:任何造成系统停止运转的时间都会触发系统故障,比如系统断电、操作系统崩溃等,使得系统必须面临重启。重启会使得数据库缓冲区的内容丢失(在内存中),而使得一些正在进行的事务以及已经提交但是没有写入数据库的事务的结果丢失。
  • 介质故障:介质指的是外存的存储介质。当外存(比如硬盘)发送损坏时,将对数据库系统造成极大的影响。
  • 计算机病毒:计算机病毒潜伏在系统内部,导致数据被破坏与篡改,且难以发觉。

总而言之,数据库故障可以分为数据库系统本身被破坏以及数据库中数据不正确两种,而解决的方法就是冗余

恢复技术的实现

建立冗余数据是应对数据库故障的基本思想,而支撑冗余数据的是数据转储技术和日志文件登记。

数据转储

数据转储很好理解,就是将数据库的数据定期复制到存储介质上保存,以期在发生故障时进行恢复。

而讨论数据转储的具体实现,我们不得不考虑下列的现实因素:

  • 数据转储本身需要时间
  • 数据转储代价很高

因此,我们将数据转储分为两种状态:

  • 静态转储:转储期间数据库没有运行的事务。此时数据库不能响应用户,导致可用性降低。
  • 动态转储:转储期间依然允许数据库的存取与修改。此时需要将转储过程中进行的事务进行登记,日后需要配合登记的日志进行数据恢复。

而数据转储又分为两种方式:

  • 海量转储:一次性备份所有数据。
  • 增量转储:每次只转储更新了的数据,而忽略从上一次转储起未更新的数据。效率较高,但是实现起来较复杂。

日志文件

日志文件记录了事务对数据库的更新操作,基于日志文件可以直接进行事务故障与系统故障的恢复,也可以在动态转储下协助转储副本进行介质故障恢复,在静态转储下使用日志文件也能将数据库恢复到故障前状态。

登记日志文件需要注意两个原则:

  • 登记次序严格按照并发事务执行的次序
  • 必须先写日志文件,然后再写入数据库。放在写入数据库时发生故障,而日志未记录导致后续恢复中丢失操作。

检查点(checkpoint)技术是日志文件中引入用于提高恢复过程中对日志文件的筛选效率。没有检查点时,当进行系统故障恢复时,我们需要扫描所有的日志记录,并筛选出哪些事务需要重做,哪些需要撤销,而实际上大部分事务已经被写入数据库而无需处理。检查点就是确定了该检查点之前提交的所有事务都已经写入数据库,而使得恢复时只需要找到最近的检查点,然后扫描该检查点之后提交的事务即可。

数据库动态维护检查点时需要遵守:

  1. 将当前日志缓冲区的所有日志记录写入磁盘的日志文件中
  2. 在日志文件中加入检查点标识,用于标记检测点与日志记录的相对位置。
  3. 将当前数据缓冲区所有已经提交的事务写入磁盘的数据库中。
  4. 将检查点位置写入一个重新开始文件,方便恢复时直接找到上一个检查点所在位置。

对事务进行恢复时遵守以下规则:

  • 检查点前COMMIT的事务 不用处理
  • 检查点前开始,检查点后且故障前COMMIT的事务 重做
  • 检查点前开始,故障后COMMIT的事务 撤销
  • 检查点后开始,故障前COMMIT的事务 重做
  • 检查点后开始,故障后COMMIT的事务 撤销
posted @ 2021-08-04 10:35  neumy  阅读(118)  评论(0)    收藏  举报