什么是数据库?数据库的三个基本特点。
数据库是长期存储在计算机内,有组织,可共享的大量数据的集合。数据库中的数据根据一定的数据模型组织,存储管理,具有较小的冗余度和较高的数据独立性,易扩展性,可大量共享。
数据库的三个基本特点:永久存储,有组织,可共享。
什么是数据库管理系统?(DBMS Database Management System)
数据库管理系统是位于用户和操作系统之间的数据管理软件。和操作系统一样是计算机的基础性软件。
数据库管理系统的功能:(1)数据定义 (2)数据组织,存储,管理 (3)数据操纵 (4)数据库创建和维护 (5)事务的运行和管理 (6)其他功能{和其他软件通信,异构数据库访问,数据转换}
什么是数据库系统?(DBS)
数据库系统是数据库,数据库管理系统,数据库管理员和应用程序组成的存储,管理,处理,维护数据的系统。
(可以理解为他是一个大范围。DBS=DB+DBMS+DBA+APP)
数据管理系统的三个阶段
第一阶段:人工管理。缺点:没有共享性,冗余度极大。需要人工操作,效率低。
第二阶段:文件管理。缺点:共享性小,冗余度大。独立性差
第三阶段:数据库系统管理。缺点:共享性大,冗余度小。较高独立性,效率高。
数据模型组成
数据模型由数据结构、数据操作,数据的完整性约束三部分组成。
数据结构:数据库的组成对象以及对象之间的联系。
常用的数据模型:层次模型,网状模型,关系模型,面向对象模型。
关系模型优点
(1) 基于严格的数学概念 (2) 数据结构清晰易懂 (3) 独立性高
模式:模式是数据库中全体数据的逻辑结构和特点的描述。
数据库的三级模型:模式,内模式,外模式
模式是全体公共数据视图。一个数据库只有一个模式
内模式是数据内部存储方式。一个数据库只有一个内模式。
外模式是用户视图。一个数据库可以有多个外模式。
从内到外的顺序是:内模式——模式——外模式(1:1:n)
数据库二级映像:外模式/模式映像,模式/内模式映像。两个映像实现了模式之间的联系和转换。保证了数据物理独立性和逻辑独立性。
数据库完整性约束:实体完整性;参照完整性;用户定义完整性。
实体完整性:主属性(主键)不能取空值(不能不存在,无意义)
参照完整性:外键必须要么取空值,要么等于被参照表元组的主键。
用户定义完整性:根据具体语义要求进行的约束(比如,成绩要求0-100之间)
关系代数:传统集合运算:并、差、交、笛卡尔积
专门关系运算:选择(行),投影(列),连接,除
等值连接:相同属性不会合并,成为两列。
自然连接:相同属性合并。
悬浮元组:因为合并而被丢弃的元组。(没有对应的可合并的元组)
外连接:悬浮元组全保留,没有的属性写NULL
左外连接:保留左关系中的悬浮元组
右外连接:保留右关系中的悬浮元组
SQL语言的特点
(1) 语句简单,逻辑清晰,综合统一 (2)高度非过程化 (3)面向集合 (4)同一种语法结构提供多种使用方式。
SQL语句总结(别看代码了,这个再看就过一遍注意点)
(1) 模式创建和定义:create schema “s-t”(模式名) authorization user1(用户名);
可以在该语句后直接创建表/视图/授权。
(2) 删除模式:drop schema “s-t” cascade/restrict [cascade级联,删除该模式的同时删除模式下所有数据库对象。Restrict限制,删除时如果该模式下还有其他数据库对象则拒绝删除]
(3) 基本表定义:
Create table student(
Sno char(9) primary key, //属性名 数据类型 列级约束;
Sname char(20) unique,
Age smallint,
Sdept char(29) //系名
Foreign key (sdept) references dept(dname) //我乱写的,表级完整性约束。
)
主键由多个属性构成,必须用表级完整性约束。Primary key(sno,cno)这样。
创建表的时候可以直接给出模式名 create table “s-t”.student
(4) 显示当前搜索路径:show serach_path(用户,模式)
管理员设置路径:set serach_path to +用户名,模式名
(5) 修改基本表://属于修改表中的列相关。
Alter table student add s_birth DATE; //增列
Alter table student alter column(这个column可写可不写) age int;//修改列类型
Alter table student drop column s_birth; //删列
Alter table student drop constraint primary key(sno);//删完整性约束
(6) 删除基本表
(突然发现删除时都有cascade/restrict规定)
Drop table student cascade;
(7) 索引:用于加快查询速度。顺序文件索引,B+索引,散列(hash)索引,位图索引。
索引由系统自动选择,用户不能选,属于内模式。
索引的SQL语言:
create unique index(关键字是index) stusno on student(sno);
//对student表的sno建立升序唯一索引stusno
Alter index stusno rename to snoindex;
//对索引改名
Drop index stusno;
//删除,没有cascade和restrict。根本没有和其他的索引之类有联系就不考虑级联。
(8) 数据查询:
Select (all / distinct 后者在查询时合并相同结果)列名……
From 表名/视图
Where 条件
Group by 列名 having 条件(常+聚集函数)
Order by 列名 asc/desc (排序)
注意事项:
A. where后的条件表达式可以是比较、between and、in、like(字符匹配 %表示任意长度字符串,包括长度为0;_下横线代表单个字符;比如where sname like”张%” )、not like 、not in 、 is not null.
还可以加 and ,or
而字符中出现%或_要在前面加转义字符\进行区分
B. where语句中不能有聚集函数,聚集函数只能出现在select 后面或者group by 的having后
select sno , avg(grade)
from sc
group by sno
having avg(grade)>=90
//查询平均成绩大于等于90分的学生学号和平均成绩,不能用 where avg(grade)
(9) 连接查询
等值连接:
Select student.,sc.
From student,sc
Where student.sno=sc.sno;
//sno一定要加表名限定,该查询最后会呈现两个sno列
自然连接则会合并相同列,这时候查询语句就会变成
Select student.sno,sname,sage,cno
From student,sc
Where student.sno=sc.sno;
From student first //起了一个别名first
外连接
Select student.sno,sname,sage,cno
From student left outer join sc on(student.sno=sc.sno)
//左外连接
还可以直接join, outer join, right join。后面都要用on写连接条件
(10) 嵌套查询
A.
不相关子查询:子查询条件不依赖父查询
相关子查询:子查询查询条件依赖父查询
区别:不相关子查询一次查询,相关子查询循环求解。
例:找出每个学生超过他自己选修课程平均成绩的课程号
Select sno,cno
From sc x
Where grade>=(select avg(grade)
From sc y
Where y.sno=x.sno
)
//执行过程是,先从外层中取出一个元组,把该值带入内层得到一个结果,再外层查询。循环执行。
B.
带any.all的子查询——就是在子查询语句外面加一个any()或者all()来限定。
C.
带EXISTS的子查询,值存在则查询执行,值不存在则停止。通常子查询都是
select *
D.
集合查询,union, intersect, except(对两个查询语句的操作)
Select *
From student
Where sdept=‘cs’
Union
Select *
From stuent
Where sage<=19
//有的可以用or and表示,但有的不行
E.
派生表
Select …as 取个别名(列)//列也可以不写,但是别名一定要取,as也可以省略
(11) 数据更新
插入数据,修改数据,删除记录(这都是对行的操作,区别alter table语句)
A. 插入
Insert
Into student(sno,sname,sex,age)
Values(‘20000’,’张三’,‘男‘,18);
//同时也可以把select查询的结果插入
B. 更新
Update student
Set age=22
Where sno=’20000’;
C. 删除
Delete
From student
Where sno=’20000’
(12) 空值
判断用 is null 或者 is not null
(13) 视图(相当重要!!)
A. 定义
视图是一张虚表。数据库中只存放视图的定义,不存放其真正的结构。对视图的操作也会转化成对基本表的操作。
B. 创建
Create view is_student //也可以自己写列名(。。。。)
As select sno,sname
From stuent
Where sdept=’is’
With check potion //用来保证对视图更新的时候,满足子查询条件
//关键字 view …as
C. 虚拟列
基本表里没有,视图列有,通过基本表的列派生出来,比如聚集函数,或者是算术表达式
D. 删除
Drop view is_student cascade;
E. 视图查询和正常基本表查询一样。
视图消解:对视图进行查询操作的时候,首先进行有效性检查,检查相关定义是否存在,如果存在就在数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成对基本表的查询,再执行修正了的查询。
(罗里吧嗦说一堆就是把对视图的查询转成对基本表)
F. 不是所有都可以转化。
视图和派生表是有区别的。视图永久性,派生表临时。
G. 对视图的更新和基本表也一样。最终会转化成对基本表的操作。
定义时如果加了with check option,更新时会自动检查是否满足定义时的条件
H. 视图的作用
(1) 视图能够简化用户的操作
(2) 使用户能以多种角度看待同一数据
(3) 视图对重构数据库提供了一定程度的逻辑独立性
(4) 安全性
数据库安全性定义
数据库的安全性指的是保护数据库以防止不合法使用造成的数据泄露、更改、破坏。
数据库不安全因素
(1) 非授权用户对数据库的恶意存取和破坏
(2) 敏感数据泄露
(3) 环境脆弱
安全性控制
(1) 用户身份鉴别
说白了就是密码
静态口令(密码),动态口令(验证码),生物特征(指纹,人脸),智能卡
(2) 存取控制
自主存取控制:grant,revoke语句。通过对存取权限的设定来进行安全性控制,对数据本身没有安全性标记
强制存取控制:对数据本身进行密级标记,无论数据怎么复制,标记和数据总是一体的。只有符合密级标记要求的用户才能操纵数据。适用于安全性要求较高的场合。
A. Grant语句
Grant select on table student
To U1
With grant option
//允许U1授权给其他用户
B. REVOKE语句
Revoke insert
On table sc
From u1 (cascade/restrict)
//cascade 级联收回U1授权出去的所有权限
Restrict 拒绝操作
(3) 视图
(4) 审计:一种事后检查的方式,
审计把用户对数据库的所有操作自动记录放在审计日记里。用于安全性检查。
语句:AUDIT,NOAUDIT
audit alter,update
On student
创建数据库用户
Create user u1 with DBA/RESOURCE/CONNECT
//创建数据库模式的权限在创建数据库用户的时候才授权
DBA:所有权限
CONNECT只能登陆查询和操纵,不能创建别的东西
RESOURCE 可以创建表和查询、操纵。不能创建用户和模式
默认connect
数据库角色
角色使权限的合集,一般为具有相同权限的用户创建一个角色。
A. 创建
Create role r1
B. 授权
和给用户授权一样
C. 可以给角色授权其他角色和用户
Grant 角色1,角色2
To 角色3
With admin option
D. 收回权限
和用户一样
数据库完整性
定义:是指数据的正确性和相容性。(注意区别安全性)
是为了防止不符合语义的,不正确的数据。
为了为维护数据库的完整性,DBMS必须实现:
(1)完整性约束机制
(2)完整性检查方法
(3)进行违约处理
实体完整性(主键):列级约束,表级约束。主码唯一,且非空。全表扫描
Primary key();
参照完整性(外键):
Foreign key(sno) references student(sno)
参照正确,存在。非空(因为参照主码啊)
用户定义完整性:
A. 属性上的约束条件
Not null(非空)
Unique(唯一)
Check语句(后面加条件表达式):sex char(2) check (sex in (‘男’,‘女‘));
违约就拒绝执行
B. 元组上的约束条件,可以设置不同属性之间的相互制约
Check (sex=’女’ or name not like ‘Ms.%’)
//性别为男时,名字不能以Ms.打头
完整性约束命名子句
Constraint c1 check (sex in (‘男’,‘女‘)); //C1是约束名
Constraint c2 primary key (sno);
完整性约束都是在create table/alter table的时候写
Alter table student
Drop constraint c1;
Alter table student
Add constraint c3 check(age<20)
断言(更一般性的约束)
A. 创建
Create assertion ass_st
Check(60>=(
Select count(*)
From course,sc
Where course.cno=sc.cno and cname=’数据库’
))
//限制数据库最多60个人选
B. 删除
Drop assertion ass_st
触发器(大重点)
定义:触发器是用户定义在关系表上的一类由事件驱动的特殊过程。
事件——条件——动作,当事件发生时,检查条件,条件符合就执行。
A. 创建触发器
Create trigger t1
Before/after select/update/insert ( of sname 指定哪一列) on student
Referencing new/old row as R1 (给新的、旧的行取个名字,方便下面操作)
For each row/statement
When (条件) 触发体
例:create trigger t1
After update of grade on sc
Referencing
Oldrow as oldtuple //没改之前是oldtuple,这是一行
Newrow as newtuple
For each row
When (newtuple.grade>=1.1* oldtuple.grade)
Insert into sc_u(sno,cno,oldgrade,newgrade)
Values(oldtuple.sno,oldtuple.cno,oldtuple.grade,newtuple.grade)
//如果对SC表的成绩修改,如果涨幅10%就记录到另一个sc_u的表里
B. 行级触发器
For each row 当触发器事件发生,表有多少行,就执行多少次触发器动作体
语句级触发器
For each statement 当触发器事件发生,只执行一次
C. 删除触发器
Drop trigger 触发器 on 表名
函数依赖:关系r中不可能存在两个元组在X属性上相等,在Y属性上不相等。成为X->Y。Y函数依赖于X。X决定Y。
完全函数依赖和部分函数依赖:
例,(sno,con)->grade是完全函数依赖 (sno,cno)->sdept是部分函数依赖因为sno->sdept。
传递函数依赖
候选码:U是R上的属性。U完全函数依赖于K,K为R的候选码
超码: U部份依赖于K,K为U的超码。候选码是最小的超码
候选码多于一个选定一个为主码
1NF第一范式: 关系中的每一个分量必须是不可分的数据项。
规范化:一个低级的范式的关系模型通过模式分解可以转换成若干高一级的范式。
2NF第二范式:每一个非主属性完全函数依赖于任何一个候选码
也就是说第二范式是消除了非主属性对码的部份依赖
3NF第三范式:每一个非主属性既不传递依赖于码,也不部分依赖于码
第三范式消除了非主属性对码的传递依赖
BCNF BC范式:每一个决定因素都有码。不允许主键的一部分被另一部分或者其他部分决定。
BC范式一定满足第三范式,但是第三范式不一定满足BC范式。
多值依赖 设R(U)是一个属性集合U上的一个关系模式,X, Y, 和Z是U的子集,并且Z=U-X-Y,多值依赖X->->Y成立当且仅当对R的任一个关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关。
书上的例子还是挺明显的。
Z为空时,X->->Y平凡的多值依赖
多值依赖具有对称性
多值依赖具有传递性,X->->Y, Y->->Z则X->->Z-Y
4NF限制不允许有非平凡非函数依赖的多值依赖
规范化的基本思想:逐步消除数据依赖中不合适的部分,达到某种程度上的分离,即“一事一地”的设计原则。规范化的目的就是为了解决插入异常,删除异常,数据冗余等问题。规范化实质上是概念的单一化。
数据库设计
数据库设计是指对于一个给定的应用环境,设计构造数据库和应用系统使之能够有效地存储和管理数据。满足各种用户地应用需求。
“三分技术,七分管理,十二分基础数据”。重要环节是数据的收集,整理,组织和不断更新。
数据库设计六个阶段
需求分析
概念结构设计
逻辑结构设计
物理结构设计
数据库实施
数据库运行和维护
需求分析主要任务:
通过详细调查现实世界要处理的对象,明确用户的各种需求,以此确定系统要实现的功能。
用户的要求:
(1) 信息要求 (2)处理要求 (3)安全性和完整性要求
数据字典
是关于所有数据库数据的描述。在需求分析阶段建立,在设计过程中不断修改、完善。在数据库设计过程中有很重要的地位。
通常包括数据项、数据结构、数据流、数据存储等。
概念结构设计
将需求分析得到的用户需求抽象为概念模型的过程就是概念结构设计。是整个数据库设计的关键。
概念模型能真实、充分的反映现实世界。易于理解,易于更改,易于向各种数据模型转换。是数据模型地基础。
E-R模型:实体、属性、实体之间的联系。
(1)实体型的联系:一对一 (1:1);一对多(1:n);多对多(m:n)
(2)实体用矩形,属性用椭圆形,联系用菱形表示
概念结构设计过程
(1)确定属性和实体
属性必须不能具有描述的性质,不包含其他属性。
(2) 找到属性之间的联系,(一对一之类)
(3) 画E-R图
(4) 大型系统可能会需要集成(先设计子系统的E-R图,然后集成)
E-R图的集成(就是将子系统得E-R图集成在一起)一般分两步:合并,修改重构
合并需要消除冲突:属性冲突、命名冲突、结构冲突
属性冲突:属性值的类型、取值范围,单位不一致
命名冲突:同名异义,异名同义
结构冲突:同一对象在不同应用中具有不同的抽象。实体联系在不同的关系中为不同的类型。
E-R图向关系模型的转换(就是概念模型转逻辑模型)
一个实体型转换为一个关系模型,关系的属性就是实体的属性,关系的码就是实体的码。
根据实体间的联系转换成不同的关系模型(1:1,1:n, m:n)
数据模型的优化
(1) 确定数据依赖
(2) 对于各关系模型之间的数据依赖进行极小化处理,消除冗余的联系
(3) 按照数据依赖理论对关系模型逐一进行分析
(4) 找到合适的范式来进行分解和合并
数据库的物理设计通常分两步:
(1) 确定数据库的物理结构:存取方法和存储结构
(2) 对物理结构进行评价,重点是时间和空间效率
之后再进行进一步操作,修改或者数据库实施
存取方法:快速存取数据库中的数据技术
B+树索引,hash索引,聚簇方法。
前两者都是建立索引,具体概念参照数据结构
聚簇方法:为了提高某个属性的查询速度,把这个属性上具有相同值的元素集中存放在连续的物理块中称为聚簇,该属性称为聚簇码。一个数据库可以建立多个聚簇,一个关系只能加入一个聚簇。聚簇的开销是相当大的,会导致物理位置发生变化
确定数据库的存储结构
考虑三方面:存取时间、存储空间利用率、维护代价三方面。
数据库的实施
设计人员根据上面的概念模型、逻辑模型、物理设计对数据库进行程序设计、编码。调试,最后运行。
数据要分批分期地组织数据入库,待运行稳定后再大批入库。也要做好转储和恢复的工作防止出现故障。
数据库的运行和维护
(1) 数据库的转储和恢复
(2) 数据库的安全性和完整性控制
(3) 性能的监督、分析和改造
(4) 数据库的重组织与重构造
数据库重组织不修改原设计的逻辑结构和物理结构,而数据库的重构造会部分修改模式和内模式
作为非过程化的查询语言SQL:操作统一、面向集合、功能丰富、使用简单。
但是:由于这种特性也导致了他难以实现应用业务中的逻辑控制。为了克服这个弱点就有了SQL编程。
嵌入式SQL:将SQL嵌入到程序设计语句中,数据库管理系统一般采用预编译的方法处理。就是识别出嵌入式语言,然后转成主语言。
区分SQL语句和主语言语句:加前缀(exec sql, #sql)
嵌入式sql语句与主语言之间的通信
(1) 嵌入式SQL——>主语言执行状态信息,SQL通信区
(2) 主语言——>sql提供参数,主变量
(3) SQL语句——>主语言查询结果,主变量和游标
以上三个概念看例子,重点在游标吧。
整个流程:(C语言)
EXEC SQL BEGIN DECLARE SECTION;//主变量声明开始
EXEC SQL END DECALRE SECTION;//主变量声明结束
Long SQLCODE;
EXEC SQL INCLUDE SQLCODE;//定义通信区
//主程序开始
EXEC SQL CONNECT TO … //连接数据库
EXEC SQL DECLARE SX CURSOR FOR+后面接一个SQL语句 //定义游标
EXEC SQL OPEN SX; //打开游标
循环从游标中取值
EXEC SQL FETCH SX INTO +主变量
这个时候用SQLCA.SQLCODE判断游标中是否还有没取出的值。Sqlcode!=0则退出循环
EXEC SQL CLOSE SX; //关闭游标
EXEC SQL COMMIT WORK; //提交更新
EXEC SQL DISCOUNNECT … //断开数据库连接
游标:是用来存放SQL语句执行结果的缓冲区。
必须使用游标的情况:多条记录的select语句,current形式的update和delete语句。
(1) 说明语句
EXEC SQL DECLARE C1 (游标名) FOR +select 语句
(2) 打开语句
EXEC SQL OPEN C1‘
(3) 推进游标指针取当前记录
EXEC SQL FETCH C1 INTO 主变量1,主变量2…(主变量和指示变量前加冒号:)
(4) 关闭游标
EXEC SQL CLOSE C1
动态SQL
主变量里用一个字符串寸SQL语句,可以将某些参数设为?
之后准备,再执行
EXEC SQL BEGIN DECLARE SECTION
Const char *stmt=”insert into student(sno) values(?);” //主变量定义
EXEC SQL END DECLARE SECTION
EXEC SQL PREPARE mystmt FROM :stmt; //准备语句prepare,给这个语句起个名字叫 mystmt
EXEC SQL EXECUTE mystmt USING 100; //执行语句execute
过程化SQL
基本结构是块,所有的过程化SQL程序都是由块组成的。
先DECLARE 执行时用BEGIN +SQL语句/流程控制语句 EXCEPTION 异常处理部分 END;
流程控制语句:IF; IF-THEN; (条件) LOOP, WHILE-LOOP, FOR-LOOP(循环)
过程化SQL块:命名块,匿名块。
匿名块:每次执行时都要进行编译,不能被存储到数据库里。也不能在其他块里调用。
命名块:过程和函数是命名块,被编译后保存在数据库中,称为持久性存储模块,可以反复调用。
存储过程:过程化SQL经编译和优化存储在数据库服务器中,不用编译,调用就可以了
(1) 创建存储过程
Create or replace procedure 过程名(参数1,2,3)
AS 过程化SQL块
(2) 执行存储过程
Call /perform procedure 过程名(参数1,2,3)
(3) 修改存储过程
Alter procedure 过程名1 rename to 过程名2 //改名
Alter procedure 过程名 compile //重新编译
(4) 删除
Drop procedure 过程名;
函数和存储过程差不多,不同之处是函数必须指定返回类型
查询处理:关系数据库管理系统执行查询语句的过程。把用户提交给关系数据库管理系统的查询语句转换为高效的查询执行计划。
分为四个阶段:1.查询分析:扫描,词法分析,语法分析 2.查询检查 :语义检查
3.查询优化:代数优化、物理优化 4. 查询执行
选择操作:全表扫描,索引扫描
连接操作:嵌套循环(暴力算法),排序——合并算法,索引连接算法,hash-join算法
查询优化:提高查询效率,使查询代价更小
物理优化:对存取路径和底层操作算法的优化(基于规则,基于代价估算,两者结合)
代数优化:对代数表达式进行优化(等价变换规则、启发式规则,优化查询树)
事务:用户定义的一个数据库序列,要么不做,要么全做,是一个不可分割的工作单位。
BEGIN TRANSACTION
COMMIT
ROLLBACK //表示回滚,指事务遇到某些故障,系统将撤销操作,回滚到事务开始时的状态
事务的ACID特性
四个特性: 原子性(atomicity),一致性(consistency),隔离性(isolation),持续性(durability)
原子性:要么不做,要么全做。不可拆分
一致性:和原子性密切相关。事务的执行结果必须是使数据库从一个状态到另一个状态。
隔离性:一个事务的执行不能被其他事务干扰
持续性:一个事务一旦提交对数据库的影响就是永久性的。
保持事务的ACID特性是事务管理的重要任务。可能遭到的破坏因素有:(1)多个事务并发执行,不同事物交叉执行。(2)强制停止
数据库的恢复:尽管数据库系统中采取了各种保护措施来防止数据库的安全性和完整性被破坏,但是还有一些是不可避免的。数据库管理系统必须具备把数据库从错误状态恢复到某一已知的正确状态的功能。
事务故障类型:事务内部的故障、系统故障、介质故障、计算机病毒
事务撤销:在不影响其他事务运行的情况下,强制回滚该事务,撤销事务做出的任何操作。使得事务好像没有启动一样。——内部
系统故障是指造成系统停止运转的任何事件,使得系统要重新启动。
恢复的基本原理:冗余。
恢复机制的两个关键问题:如何建立冗余数据、如何利用这些冗余数据实施数据库恢复。
建立冗余数据最常用的技术是数据转储和登记日志文件。
数据转储:数据库管理员定期地将整个数据库复制到磁带、磁盘或其他存储介质上保存起来的过程。后备副本,这些副本只能将数据库恢复到转储时的状态。
静态转储:转储时不能有任何操作
动态转储: 转储和用户事务可以并发执行。
海量转储:全部数据库
增量转储:只转储更新部分
日志文件是用来记录事务对数据库的更新操作的文件。
事务故障恢复和系统故障恢复必须使用日志文件。
在动态转储方式中必须建立日志文件,后备副本和日志文件结合起来才能有效地恢复数据库。
为保证数据库是可恢复的,登记日志文件时必须遵循两条原则。
(1) 登记的次序严格按照并发事务执行地时间次序
(2) 必须先写日志文件再写数据库。
数据库镜像:数据库恢复。相当于复制。镜像和源数据库一致。出现故障,就可以利用镜像恢复。
并发控制机制:当多个用户并发存取数据库时就会产生多个事务同时存取同一数据的情况,可能会存取不正确的数据。为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度。
事务是并发控制的基本单位。
并发控制带来的数据不一致性:丢失修改、不可重复读、读“脏”数据
丢失修改:T1,T2同时读(这时读到的数据是一样的),T1对其操作后,T2对其操作导致T1的操作丢失。
不可重复读:①T1读后,T2修改数据,T1再读发现值不同
②T1读后,T2删除
③T1读后,T2插入(后两种有时也叫幻影现象)
读脏数据:T1操作后,T2读,T1由于某种原因撤销操作。导致T2读到的数据和数据库内容不一样。
并发控制技术:封锁(locking),时间戳(timestamp),乐观控制法(optimistic scheduler),多版本并发控制(MVCC)。(ps:并发控制concurrency control)
(1) 封锁(大重点)
排他锁X锁(exclusive lock)
写锁:事务T对对象A上写锁,T可对A进行读写,但其他事务都不能对A上任何类型的锁。直到T释放A为止。
共享锁S锁(share lock)
读锁:事务T对对象A上读锁,则T可以读A,但不能写,其他事务只能对A上读锁不能加写锁,直到T释放A上的S锁为止。
(2) 三级封锁协议(规定一些规则,避免并发操作出现问题)
一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。(在写之前加X锁,防止丢失修改问题)
二级封锁协议:在一级基础上增加事务T在读R之前对其加S锁,读完之后释放S锁。(在读之前加S锁,读完就可以释放。防止丢失修改,脏数据问题)
三级封锁协议:在一级基础上增加事务T在读R之前对其加S锁,直到事务结束后才释放。(在读之前加S锁,事务结束才能释放。防止丢失修改,脏数据,不可重复读的问题)
(3) 活锁和死锁
活锁:某一事务永远处于等待状态。解决方法:先来先服务。
死锁:两个事务相互等待。
死锁预防:(1)一次封锁法:要求每个事务必须一次对所有要使用的数据全部加锁。 (2)顺序封锁法:预先规定一个不会发生死锁的顺序,然后按照这个顺序严格加锁。
数据库解决死锁问题:诊断并解除死锁。
(1) 超时法 (2)等待图法
通常采用的方法:选择一个处理代价最小的事务,将其撤销,释放此事务上所有的锁。使得其他事务能够继续运行下去。
可串行化调度:多个事务并发执行是正确的,当且仅当其结果与按某一次序结果相同。则称为是可串行化调度。
可串行性是并发事务正确调度的准则。
冲突操作是指不同事务对同一个数据的读写操作和写写操作。
一个操作在保证冲突操作次序不变的情况下,交换两个事务的不冲突操作次序得到另一个调度,如果此调度是串行的。则原调度是冲突可串行化的调度。
冲突可串行化是可串行化的充分条件,不是必要条件。
两段锁协议:所有事务必须分成两个阶段对数据加锁和解锁。
扩展阶段和收缩阶段
扩展阶段:只允许申请但是不能释放
收缩阶段:只能释放不能申请
是可串行化调度的充分条件,但可能会发生死锁。
多粒度封锁,自己看书,懒得写了
意向锁:如果一个结点加意向锁,则说明该节点的下层结点正在被加锁。
(节点的层次是数据库——>关系——>元组)
三种意向锁:意向共享锁(IS锁Intent share lock),意向排他锁(IX锁),共享意向排他锁(SIX锁)
IS: 事务要对数据对象加S锁,首先要对其上层加IS锁
IX:(上面那条换成X锁)
SIX锁:对一个数据对象加SIX锁,表示对他加S锁,再加IX锁。
意向锁中:任意事务要对一个数据对象加锁,必须先对他的上层结点加意向锁。
数据库管理系统层次结构
应用层——语言处理层——数据存取层——数据存储层
语言处理层:对数据库语言SQL进行语法分析、视图转换、完整性、安全性检查等,生成可执行代码(编译……)
数据存取层:处理元组,对元组实现增删改查这种操作
数据存储层:数据页和缓冲区,物理层面的管理
分布式数据库
分布式数据库是由一组数据组成,这组数据分布在计算机网络的不同计算机上,网络中的每个结点具有独立处理的能力,可以执行局部应用。同时,每个结点也能通过网络通信系统执行全局应用。(高度的自治性和整体性)