<数据库原理>DB4 数据库保护技术

本文最后更新于:2024年4月3日 晚上

DB4 数据库保护技术

DBMS 拥有四大控制功能,也称四大保护功能,分别是:数据库恢复、并发控制、完整性控制、安全性控制。DBMS 通过事务的概念实现这些功能。

DB4.1 事务

事务(Transaction):用户定义的对数据库操作的多条语句序列。这组序列要么全部执行,要么都不执行,是一个不可分割的工作单元。在任何情况下,数据库系统都必须保证事务能得到完整、正确的执行。

若事务中的操作只涉及数据检索,则称之为 只读事务,否则称之为 读写事务

SQL 中,定义事务的语法为

Begin Transaction:
	<事务体>
Commit Transaction:
	<事务提交提示>
Rollback Transaction:
	<事务回滚提示>

其中,事务体是一段 SQL 程序,可以包含多条数据操纵语句。

事务以 Begin Transaction 开始,一旦遇到 Commit 便会提交所有事务体语句。若执行任意语句时出现任何意外,导致事务无法继续进行,则事务中对数据库已经做出的任何临时操作会全部取消,回滚到事务开始前的状态,再按照 Rollback 后的语句进行操作。

DBMS 要求事务有以下性质:

  • 原子性(Atomicity):一个事务的所有操作要么全部执行,要么都不执行
  • 一致性(Consistency):事务执行的结果应保持数据的一致性,数据的完整性不会因为事务的执行遭到破坏
  • 隔离性(Isolation):多个事务并发执行时,彼此互不干扰
  • 持久性(Durability):事务成功完成后,其所有操作应永久反映在数据库中。即使系统出现故障也是如此

上述性质称为事务的 ACID 性质。

#事务的状态变迁

在不出现故障时,所有事物都能顺利完成。为了应对出现故障的情况,人们定义了事务的不同概念,以及执行时的不同状态。

graph LR
A([活动状态 \n Read/Write])
B([部分提交状态])
C([失败状态])
D([提交状态 \n Commit])
E([异常中止状态 \n Rollback])
BEG( )-->A-->B--->D-->END( )
B-->C
A-->C-->E-->END
  • 活动状态

    事务一旦遇到 Begin Transaction 语句,即进入活动状态。事务对数据库进行读写操作,但不写入硬盘,而是写入系统缓冲区

  • 部分提交状态

    没有遇到 Commit Transaction 前,事务处于部分提交状态

  • 失败状态

    处于活动状态的事务,未执行完毕前即停止执行,此时事务进入失败状态

  • 异常中止状态

    处于失败状态的事务,很可能对磁盘数据进行了部分修改。撤销这些修改的过程称为回滚。

    处于失败状态的事务,遭遇 Rollback Transaction 语句时,即进行事务回滚,此时事务处于异常中止状态

  • 提交状态

    处于部分提交状态的事务,顺利执行到 Commit Transaction 语句后,将所有修改写入硬盘。此时进入提交状态。

#事务管理器

事务的 ACID 性质遭到破坏时,事务就不能顺利进行。破坏的因素主要是事务的并发运行,以及导致事务中止的系统故障。为保证事务的顺利进行,就需要事务管理器。

事务管理器的功能有:

  • 为日志管理器传递信号,使必要信息以记录形式存储于日志中
  • 确保并发运行的事务间互不干扰。将并发事务组成正确序列,确保所有事物正确运行
graph LR
A([查询处理器])
B([事务管理器])
C([日志管理器])
D([缓冲区管理器])
E([恢复管理器])
DIA[(数据日志)]
B-->A
B-->C
B-->D
A<-->D
C<-->D
D<-->E
D<--->DIA

(事务管理器与数据库系统其他部分的关系)

  • 事务管理器

    将 事务动作信息 传递给 日志管理器

    将 数据更新以及何时把更新内容写回 传递给 缓冲区管理器

    将 有关可查询的信息 传给 查询处理器

  • 日志管理器

    维护日志信息

    通知 缓冲区管理器 何时把日志信息写入磁盘

  • 恢复管理器

    系统崩溃时,利用日志信息将数据恢复到最近的正确状态

DB4.2 数据库并发控制

若对数据库的并发操作不加以控制,会导致一些问题,比如:丢失更新、不可重复读、读脏数据

事务的执行次序称为 调度。若多个事务依次执行,则称事务 串行调度。若采用分时方法同时处理多个事务,则称事务 并发调度

对于事务的并发执行,若其执行结果与串行执行的结果相同,则称该调度策略是 可串行化的。可串行化的执行策略才是正确的。

#封锁技术

并发控制的主要方法是封锁。

:一个与数据项相关的变量,描述了该数据项的状态。数据库的每个数据项都有一个锁。当某一事务对该数据项操作前,其先向系统发送请求,对该数据项加锁。加锁后的数据项不能被其他事务更新。

基本的封锁有两种:

  • 排他锁(读写锁,X锁)

    事务将数据项加 X 锁后,可以读写该数据项内容

    直到其释放该锁前,其他事务不能读写该数据项,也不能对该数据项加任何锁

  • 共享锁(读锁,S锁)

    事务将数据项加 S 锁后,仅可读取该数据项内容,但不能更新其内容

    直到其释放该锁前,其他事务不能更新该数据项,也不能对该数据项加 X 锁,但可以读取该数据项,也可以对该数据项加 S 锁

对数据项进行加锁操作时,需要遵循一定的规则。这些规则即 封锁协议

  • 一级封锁协议

    要求事务在更新数据项前,必须对其加 X 锁,直至事务结束后再释放

  • 二级封锁协议

    在一级封锁协议的基础上,要求事务在读取数据项前,必须对其加 S 锁,读完后立即释放

  • 三级封锁协议

    在一级封锁协议的基础上,要求事务在读取数据项前,必须对其加 S 锁,直至事务结束后再释放

封锁也会带来一些问题,比如:

  • 活锁:多个事务请求对同一数据封锁时,某些事务总是等待,无法得到解锁

    解决方法是采用 先来先服务 策略

  • 死锁:多个事务循环依赖其他事务的加锁数据时,循环中所有事务都无法进行

    可使用 事务依赖图 来检查系统中是否存在死锁。存在死锁时,将其中某一事物撤销,以解除死锁。

DB4.3 数据库恢复技术

数据库系统把数据库从被破坏、不正确状态,恢复到最近一个正确状态的能力,称为数据库的 可恢复性

恢复的细节与故障的具体种类有关

#故障的种类

数据库系统运行过程中,可能的故障大致分为几类:

  • 事务故障:事务执行过程中发生的故障。

    此故障只影响少数故障事务,其余事务不受影响。

    事务故障又分两种:可预期的事务故障(程序可以发现的故障,可通过回滚解决);不可预期的事务故障(程序未估计到的错误,由系统对该事务进行撤销处理)

  • 系统故障:引起系统停止运转,随之要求系统必须重新启动的事件。

    会影响全部运行中的事务,可能破坏数据库完整性,但不影响整个数据库。

    DBMS 的恢复子系统在系统重启时,对非正常中止的事务进行处理,将数据库恢复到正确状态

  • 介质故障(硬故障):硬盘上的数据库遭到破坏,使数据库系统无法运行。

    一般使用最近的备份文件还原数据,之后通过日志进行恢复。

  • 计算机病毒:由人为编制的恶意程序对数据库系统造成的破坏。

    破坏严重时,通过最近的备份文件进行复原。不严重时,利用 DBMS 的恢复子系统进行恢复。

#数据恢复的实现技术

数据恢复机制涉及的两个问题是:如何进行数据备份;如何利用备份文件进行恢复

建立数据库备份最常用的技术是数据转储和数据库操作日志

  • 数据转储

    数据库管理员(DBA)定期将整个数据库备份到另一磁盘上保存起来。

    数据库转储分为两种:静态转储(数据库备份。没有事务操作的情况下,复制数据库文件);动态转储(允许存在其他事务操作时复制数据库。涉及检查点技术)

  • 记录日志文件

    记录事务对数据库更新的文件。

    不同数据库的文件格式不同,概括来讲有两种形式:以记录为单位;以数据块为单位

    日志的作用有:使用日志文件 撤销/重做 事务;介质故障时,先利用数据库备份还原到备份点,再通过日志文件,采用 撤销/重做 方法尽量将数据库恢复至故障点的一致状态。

DB4.4 数据库完整性控制

数据库的完整性 指数据的正确性、有效性和相容性,防止错误数据进入数据库。

  • 数据的正确性:数据合法、语义正确。主要指数据类型上的约束
  • 数据的有效性:数据取值的有效范围。
  • 数据的相容性:表示同一事实的两个数据应当相同

DBMS 中执行完整性检测的子系统称为 完整性子系统

#SQL 的完整性约束

完整性约束总是针对一定的数据对象,可以是关系、元组或属性列。因此,数据完整性约束可以分为列级约束、元组级约束和表级约束。

  • 列级约束(属性取值约束)

    是最常用,最易实现的一类完整性约束。包括:

    • 数据类型约束。如数据的长度、类型、单位、精度等
    • 取值范围、取值集合的约束。
    • 是否为空(null)的约束
    • 默认值约束
    • 取值唯一约束。
  • 元组级约束

    一个元组包含若干有序的属性值。同一元组中,不同属性的取值之间也可以定义约束条件

  • 表级约束

    一个表中的各个元组,或多表间属性取值的约束。包括完整性约束(主键)、参照完整性约束(外键)和用户自定义规则约束。

    SQL3 中的触发器

    遇到违法数据完整性的约束后,原本只能做出一些简单的动作,如拒绝操作、提示错误信息等。

    通过触发器,可以在某个操作后,系统自动根据条件转去执行其他需求的操作。触发器也属于表级约束。

DB4.5 数据库安全性控制

数据库的安全性:保护数据库,防止不合法的使用而造成的数据泄密、更改、破坏。

在 SQL 中,通过下列机制保证了数据库的安全性:

  • 视图(View)

    视图是从一个或多个基本表导出的虚拟表。其本身没有数据,只是反映了基本表的数据。

    视图一经定义,就能像基本表一样查询数据,也能用于定义新的视图。

    视图机制有三个特点:保护数据安全,逻辑数据独立,操作简单

  • 权限(Authorization)

    DBMS 的授权子系统负责对用户权限的授予与收回

  • 角色(Role)

    大型数据库中,用户数量较多,其权限亦各不相同。有某一类权限的用户称为角色。

  • 审计(Audit)

    用户对数据库的所有操作都会自动记录并存入审计日志。一旦数据库遭遇非法读取,DBA 就能根据审计日志跟踪信息,找到源头。


<数据库原理>DB4 数据库保护技术
https://i-melody.github.io/2024/04/03/数据库原理/DB4 数据库保护技术/
作者
Melody
发布于
2024年4月3日
许可协议