第五章 数据库管理
5.1 数据库管理概述
数据库管理:为保证数据库系统的正常运行和服务质量必须进行的系统管理工作。
5.2 事务管理(5-10分)
5.2.1 事务的概念
**事务概念:**事务是指由构成单个业务处理单元的一组数据库访问操作,要求它们要么都成功执行,要么都不执行
事务的状态:
事务是DBMS执行的最小任务单元。事务是DBMS最小的故障恢复任务单元和并发控制单元。
事务的特性
- 原子性:事务所有操作在数据库中要么全部执行,要么全部不执行
- 一致性:事务多次执行,其结果应一致
- 隔离性:事务与事务之间隔离,并发执行透明
- 持续性:事务完成后,数据改变必须是永久的
5.2.3 事务并发执行
多个事务程序在数据库系统中同一时段运行
并发执行的原因:
- 改善系统的资源利用率
- 减少事务运行的平均等待时间
5.2.4 事务SQL语句
事务开始:BEGIN / START TRANSACTION
事务回滚:ROLLBACK
事务提交:COMMIT
事务保存:SAVEPOINT
START TRANSACTION;
INSERT INTO college(college ID,collegename)VALUE('004','外语学院');
INSERT INTO college( collegeID, collegename)VALUES ('005', '数学学院');
INSERT INTO college( collegeID, collegename)VALUES ('006', '临床医学院');
COMMIT;
默认事务处理方式:
每执行一个SQL语句将自动构成一个事务。若将多条SQL语句定义为一个事务时,才使用专门的事务SQL语句显示地定义事务。
5.3 并发控制
并发控制的目的:
- 支持并发事务处理,使更多的用户并行操作,提高系统的并发访问能力
- 保证一个事务工作不会对另一个事务工作产生不合理的影响
5.3.1 并发控制需解决的问题
1、丢失更新数据
2、不可重复读取
一个事务对一个共享数据重复多次读取,但前后读取的数据不一致
3、脏数据读取
一个事务读取了被取消持久化的共享数据
5.3.2 并发事务调度
1、并发事务调度:
控制多个事务的数据操作语句按照恰当的顺序访问共享数据,使这些事务执行之后,避免造成数据不一致。
2、事务调度原理:
在DBMS中,事务管理器将并发执行事务的SQL数据操作请求提交给并发控制调度器。由并发控制调度器将各个事务的SQL数据操作请求按照一定顺序进行调度执行,并完成对数据库缓冲区的读写操作。
3、事务调度的策略:
**可串化调度:**在事务并发执行中只有当事务中数据操作调度顺序的执行结果与事务串行执行结果一样时,该并发事务调度才能保证数据操作的正确性和一致性。符合这样效果的调度成为可串行调度。
**DBMS并发事务调度目标:**使并发事务调度实现的处理结果与串行化调度处理结果一致。
5.3.3 数据库锁机制
为了解决多个事务并发对共享数据进行新增、更新、删除、查询带来的数据不一致性问题时,需要对共享数据进行加锁访问。
[图片]
1、资源锁定访问——加锁方式
- 排他锁定(lock-X)——锁定后,不允许其他事务对共享数据再加锁-----------锁定后其他的什么都不能干
- 共享锁定(lock-S)——锁定后,只允许其他事务对共享数据添加读取锁--------------锁定后其他的还能读
Lock-X(D)对数据D排他锁定,只能这个进程使用D
Lock-S(D)申请对D的共享锁定,想使用D,使用过程中其他的进程可以读D
Unlock(D)释放对数据D的锁定
2、资源锁定粒度
- 数据库——粒度最大
- 表——粒度较大
- 页面——粒度中等
- 行——粒度小
3、资源锁定实施方式
- 隐式锁定——DBMS缺省执行
- 显示锁定——加锁命令显示执行
5.3.4 基于锁的并发控制协议
为了实现并发事务对共享数据访问的串行化调度执行,还必须约束它们对共享数据的操作访问必须是以互斥方式进行。这就需要基于数据库锁机制的并发控制协议。
1、锁操作的相容性
2、加锁协议
一级加锁协议:
任何事务在修改共享数据对象之前,必须对该数据执行排他锁定指令,直到该事务处理完成,才进行解锁指令执行。
特点:可以避免出现更新丢失的问题,但是不能解决不可重复读取,脏读等数据不一致的问题。
二级加锁协议:
在一级加锁协议的基础上,针对并发事务的共享数据读操作,必须对该数据执行共享锁定指令,读完数据后即可释放共享锁定。
也就是想要处理共享数据先加排他锁,另一个想要读数据就加共享锁
也可以理解,想要读数据的进程都加共享锁
**特点:**解决了“丢失更新”数据不一致问题和“脏读”; 但还会出现“不可重复读取”的数据不一致的问题。
三级加锁协议
在一级加锁的基础上,针对并发事务对共享数据进行读操作,必须对数据执行共享锁定指令,直到该事务处理结束才释放共享锁定。
特点:解决 “丢失更新" ”脏读“ ”不可重复读取“的问题
因为是并发执行的,所以读读数据读的是100
读了两次应该都是100。所以数据加锁之后,最后一次读完再解锁。
读完再释放,排他锁才可以使用。
5.3.5 两阶段锁定协议
**并发事务的正确调度准则:**一个给定的并发事务调度,当且仅当它是可串行化时,才能保证正确调度。
两阶段锁定协议:保证可串行化的一个协议。
两阶段锁定协议:规定每个事务必须分两个阶段提出加锁和解锁申请
- 增长阶段:事务只能获得锁,但不能释放锁
- 缩减阶段:事务只能释放锁,但不能获得新锁
结论:若并发事务执行的所有事务都遵从两阶段锁定协议,则这些事务任何并发调度都是可串行化调度,即这些并发调度执行结果可以保证数据库一致性。
5.3.6 并发事务死锁解决
1、事务死锁:
在基于锁机制的并发事务执行中,如果这些事务同时锁定两个以及以上资源时,可能会出现彼此都不能继续执行的状态
[图片]
[图片]
2、死锁出现的必要条件
- 互斥条件
- 请求和保持条件
- 不可剥夺条件
- 环路等待条件
3、防范死锁的策略 - 允许用户一次发出当前所需全部资源的锁定,使用完成后,再释放给其他用户访问。
- 规定所有应用程序锁定资源的顺序必须完全相同
4、解决死锁的办法
当发生死锁时,回滚其中的一个事务,并取消它对数据库所做的改动
5.3.7 事务隔离级别
为了避免并发运行中可能出现的脏读,不可重复读,幻象读和丢失更新问题,可在DBMS中设置事务隔离级别选项参数。
[图片]
读取未提交的并发性最强
并发性越强,出现的问题越多
事务隔离级别设置越高,出现数据不一致的可能性越小,但系统吞吐量也越小。
[图片]
[图片]
5.4 安全管理
5.4.1 数据库系统面临的安全风险
[图片]
5.4.2 数据库系统安全模型
[图片] - 身份验证:从应用系统层面确认登录用户是否是合法使用者
- 权限控制:从DBMS系统层面通过存取权限机制控制用户对数据的访问
- 系统防护:从操作系统层面提供的安全机制防范非法系统访问
- 加密存储:从数据存储层面通过加密算法对数据库中数据进行加密存储
[图片]
[图片]
[图片]
5.4.3 用户管理
[图片]
用户管理:在数据库安全管理中,DBMS需要对每个用户进行管理,如用户创建,用户修改,用户删除管理等。
实现用户管理方式: - 数据库服务器执行SQL语句管理用户
- 通过管理工具GUI操作管理用户
1、用户创建SQL语句
CREATE USER <用户账号名> [ [WITH] opention […] ];
[图片]
CREATE USER “userA” WITH
LOGIN
NOSUPERUSER
NOCREATEDB
NOCREATEROLE
INHERIT
NOREPLICATION
CONNECTION LIMIT-1
PASSCORD ‘123456’;
2、用户修改SQL语句
1、修改用户的属性
ALTER USER <用户名> [ [WITH] opention […] ];
2、修改用户的名称
ALTER USER <用户名> RENAME TO <新用户名>;
3、修改用户的参数值
ALTER USER <用户名> SET <参数项> { TO |=}{value | DEFAULT};
4、重置用户参数值
ALTER USER <用户名> RESET <参数项>;
[图片]
ALTER USER “userA”
PASSWORD ‘gres123’
CONNECTION LIMIT 10;
3、用户删除语句
DROP USER <用户名>;
5.4.4 权限管理
数据库权限管理:DBA管理员或数据库对象拥有者对其所拥有对象进行权限控制设置。
权限管理基本操作: - 授予权限
- 收回权限
- 拒绝权限
权限类别: - 数据库系统权限
- 数据库对象访问权限
- 数据库对象定义操作权限
[图片]
[图片]
读取数据就是 SELECT
GRANT SELECT ON Department TO userA;
GRANT SELECT ON Employee TO userA;
GRANT SELECT ON Project TO userA;
GRANT SELECT ON Assignment TO userA;
5.4.5 角色管理
为了方便对众多用户及其权限进行管理,通常将一组具有相同权限的用户定义为 角色
角色管理内容: - 创建角色
- 修改角色
- 删除角色
角色管理实现方式 - 执行SQL语句管理角色
- 通过GUI操作管理角色
角色管理SQL语句
1、创建角色:CREATE ROLE <角色名> [ [WITH] option […] ];
2、修改角色属性:ALTER ROLE <角色名> [ [WITH] option […] ];
3、修改角色名称:ALTER ROLE <角色名> RENAME TO <新角色名>;
4、修改角色参数值:ALTER ROLE <角色名> SET <参数项> {TO |= } { value | DEFAULT};
5、复位角色参数值:ALTER ROLE <角色名> RESET <参数项>;
6、删除指定角色:DROP ROLE <角色名>;
[图片]
CREATE ROLE “Role_Manager” WITH
LOGIN
INHERIT
NOSUPERUSER
NOCREATEDB
NOCREATEROLE
NOREPLICATION
CONNECTION LIMIT -1;
[图片]
这样写对吗??????????
DRANT
INSERT,ALTER,DELETE,SELECT
ON Department,Employee,Project,Assignment
TO “Role_Manager”;
[图片]
5.5 数据库备份与恢复
[图片]
5.5.1 数据库备份
数据库备份:将数据库当前数据和状态进行副本复制,以便当数据库收到破坏或丢失数据时可以进行修复。
数据库恢复:数据库丢失或被破坏时,从备份副本将数据库从错误状态恢复到某一正确状态。
备份内容:数据文件,日志文件等。
备份角色:服务器管理员,数据库所有者,数据库备份员角色之一。
备份方式: - 完整数据库备份
- 差异数据库备份
- 事务日志备份
- 文件备份
备份介质: - 磁盘阵列
- 磁带库
- 光盘库
备份时机: - 当数据库重要数据被修改时
- 日志被清理
- 用户数据库创建
- 用户数据库加载
5.5.2 数据库备份方法
[图片]
[图片]
[图片]
BACKUP DATABASE SAMPLE
TO DISK = ‘G:\Sample.bak’;
5.5.4 数据库恢复方法
1、通过备份文件进行恢复
[图片]
[图片]
RESTORE DATABASE SAMPLE
FROM DISK = ‘G:\Samle.bak’;
[图片]
2、利用事务日志按前滚或回滚范式进行数据库恢复
[图片]
5.6 数据库管理项目实践
[图片]
[图片]
[图片]
[图片]
[图片]
5.7 存储及索引
5.7.1 数据库存储结构 - 逻辑存储结构:面向数据库编程用户
- 物理存储结构:面向DBA用户
[图片]
一个数据库物理上是将数据存储在若干数据文件中的,这些数据文件在操作系统的文件目录中组织与存储数据。
[图片]
5.7.2 数据文件组织
逻辑存储结构:基本单位 内存页
物理存储结构:基本单位 操作系统的文件块(OS块)
它们都由若干数据记录组成。
1、数据文件记录结构
定长记录
[图片]
[图片]
变长记录
[图片]
2、数据文件的记录组织
数据文件的记录组织方式,即如何将大量记录组织为数据文件,以便DBMS对数据文件进行数据记录访问。 - 堆文件组织
- 顺序文件组织
- 多表聚簇文件组织
- Hash文件组织
5.7.3 数据字典存储与存储引擎
数据字典/系统目录:存放数据库元数据的系统数据库表及其视图 - 数据库表、属兔结构数据
- 系统角色、用户数据
- 索引数据
用户可通过系统视图对元数据进行查询处理
数据库存储管理功能是由DBMS软件的存储引擎来实现的,
存储引擎/存储管理器:负责数据库中数据存储,数据检索和数据更新等处理。
[图片]
5.7.4 索引结构原理
索引:一种数据记录定位结构。它将查询条件键值作为输入,能快速从索引结构(如索引表)获取该条件键值对应数据记录的位置指针,通过位置指针从关系表中找出结果集记录。
[图片]
[图片]
5.7.5 B+树索引
[图片]
一棵n阶(n为节点可存储的搜索键最大值)的B+树具有的特性:
- 从根节点到叶子节点的每条路径长度相同
- 每个非叶节点不保存数据记录,它只存储搜索键值以及下层节点指针
- 叶子节点不仅包含搜索键字,还包括键值对应的数据记录指针和节点链表指针
[图片]
[图片]
5.7.6 散列表索引
散列表:哈希表,是一种根据键值在散列表中获取数据记录指针的数据结构
[图片]
[图片]
[图片]
例子
[图片]
[图片]
[图片]