数据库的安全性
安全性:防止用户非法使用数据造成的数据泄露、更改或破坏
数据保密:用户合法的访问到这些数据库能否对这些数据保密(法律法规)
安全性控制:尽可能的杜绝可能的数据库非法访问
安全性控制的一般方法
用户标识和鉴定
系统提供的最外层安全保护措施
用户名/口令
约定好一个计算过程或函数
系统提供随机数,用户根据事先约定的算法进行计算
存取控制
功能:用户只能访问其有权存取的数据
组成: 定义存取权限、检查存取权限
用户权限和合法性检查一同组成了DBMS的安全子系统
存取权限: 数据对象、操作类型
用户名 | 数据对象名 | 允许的操作 |
Zero | 关系Student | SELECT |
Zeta | 列Sc.Sno | ALL |
编译后的授权存放在数据字典中
存取权限:
过程 用户/DBA将授权决定告知系统(GRANT和REVOKE完成)
DBMS将授权结果存入数据字典
用户操作请求时,由DBMS根据授权情况决定是否执行请求
授权粒度:数据库、表、属性列、行
DCL存取权限管理
授权:
grant SELECT on table Student to U1--将Student的查询权限赋予U1
grant ALL PRIVILEGES on table Student,Course to U2,U3--将两个表的所有权限赋予U2和U3
grant SELECT on table Sc to PUBLIC--将Sc的查询权限赋予所有用户
grant UPDATE(Sname),SELECT on table Student to U4--将查询表和修改学生姓名的权限赋予U4
grant INSERT on table Sc to U5 with grant option--将权限赋予U5并允许其向其他用户授权
权限收回:
revoke UODATE(Sname) on table Student from U4--收回U4的学生姓名修改权限
收回权限会收回此用户的转授权对象的权限
视图
视图提供数据独立性、一定程度上起到安全保护功能
审计
系统自动将用户对数据库的所有操作记录在审计日志上
C2以上安全级别的DBMS必须具有审计功能
DBA可以根据安全性需求,打开/关闭审计功能
审计技术是预防手段(不同于用户识别和坚定、存取控制、视图等强制性机制)
密码存储
数据加密:防止数据库中的数据在存储和传输中失密
数据加密一般作为可选特征
数据库的并发控制
事务是并发控制和恢复的基本单位
定义事务的两种方式
显式方式、隐式方式
显式定义事务
BEGIN TRANSACTION--事务开始
SQL1
SQL2
...
COMMIT--事务正常结束,提交所有语句
ROLLBACK--事务回文结束,回滚事务的所有操作
事务的特性
原子性:事务中的操作要么全部执行、要么全部不执行(不可分)
一致性:事务执行的结果必定让数据库:一致性状态 --> 一致性状态(不是一个一致)
隔离性:一个事务的执行不能被其他事务干扰(并发执行的事务之间不能相互干扰)
持久性:事务提交后对数据库的事务改变是永久的
事务的并发执行
串行执行
每个时刻只有一个事务运行
缺点:不能充分利用资源,不能发挥数据库共享资源的特点
交叉并发
并行的事务轮流交叉运行,是单处理机系统中的并发方式
同时并发
作用于多处理机系统中,可以同时运行多个事务
事务并发执行带来的问题:破坏事务的隔离性和数据库的一致性,解决此问题要求DBMS必须提供并发控制机制
事务并发带来的数据不一致性: 丢失修改(写入的数据被覆盖了)
不可重复读(读到的数据被修改/删除/插入了)
读“脏”数据(读数据后数据修改被撤销了)
并发事务的调度
将所有事物串行起来的策略一定是正确的调度策略
可串行化的调度,串行的顺序不同时,结果也会不同;但是由于不会让数据库置于不一致状态,故可认为是正确的
可串行性化是并行事务正确性的唯一准则
可串行化示例:假设客户端C1发布了事务T1,T2;客户端C2发布了事务T3,T4;试问有多少种可串行化的调度顺序
提示:T1必须先于T2,T3必须先于T4
1.T1,T2, T3,T4 T1,T3,T4,T2
2.T3,T4, T1,T2 T3,T1,T2,T4
3.T1,T3,T2,T4 T3,T1,T4,T2
封锁
封锁:事务T在对某个数据对象操作之前,先向系统发出请求,对其加锁
加锁后事务T就该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象
封锁类型
排他锁(X锁,写锁)
共享锁(S锁,读锁)
排他锁:
A加上X锁后,仅T1允许T1对A进行读取和修改
A加上X锁后,其他事务不能对A施加任何类型的锁,直到A上的X锁被释放
共享锁:
A加上S锁后,所有事务(包括T1)仅能对A进行读操作(不允许修改)
A加上S锁后,其他事务只能对A施加S锁
封锁粒度
X锁和S锁都可以施加在一个数据对象/逻辑单元,大到整个数据库,小到某个属性
封锁粒度 | 被封锁的对象 | 并发度 | 系统开销 |
大 | 多 | 小 | 小 |
小 | 少 | 高 | 大 |
选择封锁度时,必须考虑开销和并发度
封锁粒度的一般原则:
需求 | 粒度 |
大量元组 | 关系 |
多个关系的大量元组 | 数据库 |
少量元组 | 元组 |
封锁协议
何时申请X锁或S锁、持锁时间、何时释放
三级封锁协议--保证数据一致性
一级封锁协议:事物T修改数据前必须对其加X锁,直到事务结束才能释放
防止丢失数据更新,若仅修改则不需要加锁
二级封锁协议:一级封锁协议基础上,事务T在读取数据前必须对其加S锁,直到读完释放S锁
防止丢失修改和读“脏”数据
三级封锁协议:一级封锁协议基础上,事务T在读数据之前必须对其加S锁,直到事务结束才释放
防止丢失修改、读“脏”数据,不可重复读
两段封锁协议--保证并行调度可串行性
1.在对任何事务进行读、写之前,事务先要获得对该数据的封锁(扩展阶段)
2.在释放一个封锁之后,事务不再获得任何其他封锁(收缩阶段)
遵守两段锁协议的事务都是可串行化的,执行结果一定是正确的
死锁和活锁
活锁:系统使某个事务一直处在等待,永远等不到封锁的机会
解决:采用先来先服务的策略
死锁:两个事务要求锁定对方的资源,但是其需要获得锁定后才能解除自身锁定,造成无限等待
预防:(不可能杜绝死锁)
一次封锁法
要求每个事务一次性将所有要加锁的数据全部加锁,否则就不能执行(降低并发度、难以事先确定封锁对象)
顺序封锁法
预先对数据对象规定一个封锁顺序,所有事务都按照顺序实行封锁(维护成本高,难以实现)
诊断与解除:由DBMS定期检测系统中是否存在死锁,如果检测到死锁,就要设法解除
超时法:一个事务等待时间超过了门限,就认为发生了死锁(可能误判)
等待图法:用事务等待图(有向图)动态反映所有事务的等待状态,DBMS定期检测事务等待图,如果发生回路,则说明发生死锁,系统会解除代价最小的一个事务
故障与恢复
数据库的可恢复性:将数据库从被破坏、不正确的状态恢复到一个正确的状态
各个事务中的操作要么全做、要么全不做
故障
事务故障(破坏数据库一致性)
某个事务未正常运行至终点
常见原因:输入数据有误、运算溢出、违反了完整性约束、程序出错、发生死锁
系统故障(破坏数据库一致性)
整个系统的非正常运行,导致正在运行中的事务全部不正常终止
内存中的数据缓冲区信息全部丢失,外部存储设备上的数据不会受影响
常见原因:操作系统/DBMS代码错误、操作员误操作、硬件错误、停电
介质故障(破坏数据库本身)
破坏性最大
常见原因“磁盘损坏、磁头碰撞、操作员误操作、瞬时强磁场干扰
恢复
恢复技术的原理:利用存储在系统其他地方的冗余数据来修复或重建数据库
恢复技术的关键:1.如何建立冗余数据:数据转储、登记日志文件
2.如何利用冗余数据实施恢复
数据转储
DBA将整个数据库复制到另一个介质上保存起来(后备副本、后援副本)
用途:供介质故障的时候使用
静态转储:转储时无运行中的事务(转储操作开始时,数据库处于一致性状态)
缺点:降低了数据库的可用性
动态转储:转储操作与用户事务并发
缺点:不能保证副本中数据的正确有效
恢复:重装副本+动态转储期间的日志文件恢复
海量转储:整个库转储
增量转储:只转储上次更新过的数据
日志文件
记录事务对数据库更新操作的文件
格式: 1.以记录为单位的日志文件
2.以数据块为单位的日志文件
内容: 1.事务开始标记
2.事务结束标记
3.事务所有的更新操作
基于记录的日志文件: 事务标识、操作类型、操作对象、更新前的旧值、更新后的新值
基于数据块的日志文件: 事务标识、更新前整个数据块的值、更新后整个数据块的值
等级原则:严格按照执行次序登记;必须先写日志文件、后写数据库
恢复策略
事务故障的恢复策略
由系统撤销(UNDO)此事务修改
系统故障恢复
撤销故障发生时未完成的事务
重做已完成的事务
介质故障的恢复
利用转储副本和日志文件将数据库恢复
1.重装最近转储的数据库副本和相关的日志文件副本
2.执行系统提供的恢复命令
复制
数据库复制
复制提高数据库容错性、主要用于分布式结构的数据库
数据库出现故障时,系统利用副本对其进行联机恢复,恢复期间数据库用户可以继续访问数据库副本(副本和主数据库同等地位)
数据库复制的方法:对等复制:主副数据库同等地位,可以互相复制
主/从复制:数据从主数据库复制到从数据库(更新数据只能在主数据库进行、从数据库可以提供用户读取数据。主数据库出现问题时,更新数据库会转移到其中一个副数据库上)
级联复制:从主数据库复制的数据再次复制到其他数据库
要求: 数据库复制必须对用户透明
所以数据库必须保持事务的完整性
系统必须提供控制冲突的方法
数据库镜像
系统自动将整个数据库或其中的关键数据复制到另一个磁盘上,系统自动保证镜像数据与主数据保持一致性
出现介质故障时,系统自动利用镜像磁盘数据对数据库进行恢复(不需要关闭系统) 未出现故障时,也可以在一个事务对数据加X锁时提供其他事务的读取