<数据库原理>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 就能根据审计日志跟踪信息,找到源头。