数据库恢复

事务

事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。在关系数据库中,一个事务可以是一条 SQL 语句、一组 SQL 语句或整个程序。事务具有 4 个特性:原子性、一致性、隔离性和持续性,简称为 ACID 特性

ACID 特性 说明
原子性 事务是数据库的逻辑工作单位,事务中的操作要么都做,要么都不做
一致性 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
隔离性 一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰
持续性 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的

事务是恢复和并发控制的基本单位,保证事务 ACID 特性是事务管理的重要任务。事务 ACID 特性可能遭到破坏的因素有:

  1. 不同事务的操作交叉执行。此时数据库管理系统必须保证多个事务的交叉运行,不影响这些事务的原子性。
  2. 事务在运行过程中被强行停止,数据库管理系统必须保证被强行终止的事务对数据库和其他事务没有任何影响。

在 SQL 语句中,事务通常是以 BEGIN TRANSACTION 开始,以 COMMIT 或 ROLLBACK 结束。COMMIT 表示提交,将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。ROLLBACK 表示回滚,即在事务运行的过程中发生了某种故障,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。

故障的种类

数据库系统中可能发生各种各样的故障,大致可以分以下几类。

故障类型 说明
事务内部的故障 有的是可以通过事务程序本身发现的,有的是非预期的,不能由事务程序处理
系统故障 称为软故障,指造成系统停止运转的任何事件,使得系统要重新启动
介质故障 称为硬故障,指外存故障,如磁盘损坏、磁头碰撞,瞬时强磁场干扰等
计算机病毒 是一种人为的故障或破坏,是一些恶作剧者研制的一种计算机程序

各类故障对数据库的影响有两种可能性,一是数据库本身被破坏,二是数据库没有被破坏,但数据可能不正确,这是由于事务的运行被非正常终止造成的。恢复的基本原理是冗余,可以根据存储在系统别处的冗余数据来重建。对于不同的故障类型,恢复的策略不同:

故障类型 影响 恢复策略
事务故障 事务在运行至正常终止点前被终止 恢复方法由恢复子系统应利用日志文件撤消此事务已对数据库进行的修改
系统故障 未完成事务对数据库的更新已写入,或者已提交事务对数据库的更新还留在缓冲区,没来得及写入 撤销故障发生时未完成的事务,重做已完成的事务
发生介质 磁盘上的物理数据和日志文件被破坏 重装数据库,然后重做已完成的事务

恢复技术

数据转储

转储是指 DBA 将整个数据库复制到磁带或另一个磁盘上保存起来的过程,备用的数据称为后备副本或后援副本。数据库遭到破坏后可以将后备副本重新装入,重装后备副本只能将数据库恢复到转储时的状态。要想恢复到故障发生时的状态,必须重新运行自转储以后的所有更新事务。转储主要分为 4 种:

转储类型 说明
静态转储 在系统中无运行事务时进行,转储期间不允许对数据库的任何存取、修改活动,得到的一定是一个数据一致性的副本
动态转储 指转储期间允许对数据库进行存取或修改,和用户事务可以并发执行,但后援副本上的数据并不能保证正确有效
海量转储 每次转储全部数据库,得到的后备副本进行恢复一般说来会更方便些
增量转储 每次只转储上一次转储后更新过的数据,如果数据库很大,事务处理又十分频繁,则该方式更实用更有效

日志文件

日志文件是用来记录事务对数据库的更新操作的文件,为保证数据库是可恢复的,登记日志文件时登记的次序严格按并发事务执行的时间次序,同时必须先写日志文件后写数据库。日志文件的格式包括以下两种:

日志文件类型 说明
以记录为单位 登记的内容包括各个事务的开始、结束标记和所有更新操作
以数据块为单位 记录的内容包括事务标识和被更新的数据块

日志文件可以用来进行事务故障恢复和系统故障恢复,并协助后备副本进行介质故障恢复:

  1. 事务故障恢复和系统故障恢复必须用日志文件;
  2. 在动态转储方式中,后备副本和日志文件结合起来才能有效地恢复数据库;
  3. 在静态转储方式中,当数据库毁坏后可重新装入后援副本把数据库恢复到转储结束时刻的正确状态,然后利用日志文件把己完成的事务进行重做处理。

    检查点

    利用日志技术恢复数据库时,搜索整个日志将耗费大量的时间,且很多需要重做处理的事务实际上已经将它们的更新操作结果写到了数据库中,然而恢复子系统又重新执行了这些操作,浪费了大量时间。
    具有检查点的恢复技术是在日志文件中增加检查点记录,增加重新开始文件,恢复子系统在登录日志文件期间动态地维护日志。动态维护日志文件的方法是周期性地执行建立检查点和保存数据库状态。
    image.png

    数据库镜像

    介质故障是对系统影响最为严重的一种故障,恢复比较费时,为预防介质故障,DBA 必须周期性地转储数据库。提高数据库可用性的解决方案是使用数据库镜像,DBMS 自动把整个数据库或其中的关键数据复制到另一个磁盘上。DBMS 自动保证镜像数据与主数据库的一致性,每当主数据库更新时,DBMS 自动把更新后的数据复制过去。
    image.png
    出现介质故障时可由镜像磁盘继续提供使用,同时 DBMS 自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本。没有出现故障时,也可用于并发操作。例如一个用户对数据加排他锁修改数据,其他用户可以读镜像数据库上的数据。
    image.png

    并发控制

    不一致问题

    多用户数据库系统允许多个用户同时使用的数据库系统,在同一时刻并发运行的事务数可达数百个。事务是并发控制的基本单位,保证事务的 ACID 特性是事务处理的重要任务。为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度。并发可能带来以下 3 种不一致问题:
不一致问题 说明
丢失修改 事务 T1 和 T2 读入同一数据并修改,T2 提交的结果破坏了 T1 提交的结果,导致 T1 的修改被丢失
不可重复读 事务 T1 读取数据后,事务 T2 执行更新操作,使 T1 无法再现前一次读取结果
读“脏”数据 事务 T1 修改某一数据并将其写回磁盘,事务 T2 读取同一数据后,T1 由于某种原因被撤销导致数据恢复原值

数据不一致性是由于并发操作破坏了事务的隔离性,并发控制就是要用正确的方式调度并发操作。
image.png

封锁

封锁就是事务 T 在对某个数据对象操作之前,先向系统发出请求,对其加锁。加锁后在事务 T 释放它的锁之前,其他事务不能更新此数据对象。基本的封锁类型有两种:

封锁类型 说明
排他锁(X 锁) 又称写锁,加上 X 锁后只允许 T 读取和修改 A,其他任何事务都不能再对 A 加任何类型的锁,直到 T 释放锁为止
共享锁(S 锁) 又称读锁,加上 S 锁后事务 T 可以读 A 但不能修改 A,其他事务只能再对 A 加 S 锁,直到 T 释放 A 上的 S 锁为止

image.png
在运用 X 锁和 S 锁时还需要约定一些规则,例如何时申请 X 锁或 S 锁、持锁时间、何时释放等。不同级别的封锁协议达到的系统一致性级别是不同的,一级封锁协议可防止丢失修改,但不能保证可重复读和不读“脏”数据。二级封锁协议可以防止读“脏”数据,但由于读完数据后即可释放 S 锁,所以它不能保证可重复读,三级封锁协议可以进一步防止了不可重复读。

封锁协议 说明
一级封锁协议 事务 T 在修改数据 R 之前必须先对其加 X 锁,直到事务结束才释放
二级封锁协议 在一级封锁协议基础上增加事务 T 在读取数据 R 之前必须先对其加 S 锁,读完后即可释放 S 锁
三级封锁协议 在一级封锁协议的基础上增加事务 T 在读取数据 R 之前必须先对其加 S 锁,直到事务结束才释放

封锁对象的大小称为封锁粒度,封锁的对象可以是逻辑单元或物理单元,封锁粒度与系统的并发度和并发控制的开销密切相关。封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小。封锁的粒度越小,并发度较高,但系统开销也就越大。

活锁和死锁

封锁技术可以有效地解决并行操作的一致性问题,但也带来了死锁和活锁问题。活锁指的是事务 T1 封锁了数据 R,事务 T2 又请求封锁 R,于是 T2 等待。T3 也请求封锁 R,当 T1 释放了 R 上的封锁之后系统首先批准了 T3 的请求,T2 仍然等待。T4 又请求封锁 R,当 T3 释放了 R 上的封锁之后系统又批准了 T4 的请求。这就导致了 T2 有可能永远等待,避免活锁的简单方法是采用先来先服务的策略。
关于死锁的内容,可以参考操作系统解决死锁的方法——操作系统:死锁概念和处理方法

两段锁

多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,称这种调度策略为可串行化调度。可串行性是并发事务正确调度的准则,为了保证调度可串传,数据库管理系统普遍采用两段锁。
两段锁协议指所有事务必须分两个阶段对数据项加锁和解锁:

  1. 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁;
  2. 在释放一个封锁之后,事务不再申请和获得任何其他封锁。

    数据库安全性

    数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏,对数据库安全性产生威胁的因素主要有以下几方面。

  3. 非授权用户对数据库的恶意存取和破坏;

  4. 数据库中重要或敏感的数据被泄露;
  5. 安全环境的脆弱性。

    安全标准

    根据计算机系统对各项指标的支持情况,TCSEC/TDI 将系统划分为 4 组 7 个等级,依次是D、C(C1,C2)、B(B1,B2,B3)、A(A1),按系统可靠或可信程度逐渐增高。
安全等级 定义 说明
D 级 最小保护 最低级别,一切不符合更高标准的系统统统归于 D 组
C1 级 自主安全保护 能够实现对用户和数据的分离,保护或限制用户权限的传播
C2 级 受控的存取保护 以个人身份注册负责,并实施审计和资源隔离
B1 级 标记安全保护 对系统的数据加以标记,并对标记的主体和客体实施强制存取控制以及审计等安全机制
B2 级 结构化保护 建立形式化的安全策略模型,并对系统内的所有主体和客体实施 DAC 和 MAC
B3 级 安全域 必须满足访问监控器的要求,审计跟踪能力更强,并提供系统恢复过程
A1 级 验证设计 提供 B3 级保护的同时给出系统的形式化设计说明和验证,以确信各安全保护真正实现

安全性控制

用户身份鉴别是最外层的安全保护措施,每个用户标识由用户名和 UID 两部分组成,UID 在系统的整个生命周期内是唯一的,系统内部记录着所有合法用户的标识。系统鉴别是指由系统提供一定的方式让用户标识自己的名字或身份,通过鉴定后才提供使用数据库管理系统的权限。

用户身份鉴别方法 说明
静态口令鉴别 由用户自己设定静态口令,鉴别时只要按要求输入正确的口令
动态口令鉴别 口令是动态变化的,每次鉴别时均需使用动态产生的新口令登录数据库管理系统
生物特征鉴别 通过生物特征进行认证的技术,通过采用图像处理和模式识别等技术实现了基于生物特征的认证
智能卡鉴别 智能卡具有硬件加密功能,登录数据库管理系统时用户将智能卡插入专用的读卡器进行身份验证

数据库安全最重要的一点就是确保只授权给有资格的用户访问数据库的权限,主要通过数据库系统的存取控制机制实现。存取控制机制主要包括定义用户权限和合法权限检查两部分:

存取控制机制 说明
定义用户权限 数据库管理系统能够来定义用户权限,经过编译后存储在数据字典中作为安全规则或授权规则
合法权限检查 数据库管理根据安全规则进行合法权限检查,若用户的操作请求超出了定义的权限,系统将拒绝执行此操作

C2 级的数据库管理系统支持自主存取控制 DAC,B1 级的数据库管理系统支持强制存取控制 MAC,这两类方法的简单定义是:

存取控制方法 说明
自主存取控制方法 用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,用户还可将其拥有的存取权限转授给其他用户
强制存取控制方法 每一个数据库对象被标以一定的密级,每一个用户也被授予某一个级别的许可证,只有具有合法许可证的用户才可以存取对象

参考资料

《数据库系统概论(第5版)》,王珊 萨师煊 编著,高等教育出版社