数据库具有冗余度小,独立性高,易扩展,共享性,永久存储,有组织,可共享的特点
1. 数据库定义和创建功能
创建数据库主要是用数据定义语言定义和创建数据库模式,外模式,内模式等数据库对象。
2.数据组织存储和管理功能
数据库管理系统要分类组织,存储和管理各种数据,包括数据字典用户数据,存取路径等!
3.数据库事务管理和运行管理
这是指数据库管理系统的运行控制和管理功能,包括多用户环境下的事务管理功能和安全性,完整性控制功能,数据库恢复并发控制和死锁检测(或死锁防止),安全性检查和存取控制,完整性检查和执行,运行日志的组织管理等。
4.数据存取功能
数据库管理系统提供用户对数据的 操作功能,实现对数据库数据的检索,插入,修改和删除。
5.数据库的建立和维护
此项功能包括数据库的初始建立,数据的转换,数据库的转储和恢复,数据库的重组织和重构造,以及性能检测分析。
6.其他功能
此外数据库管理系统还包括与网络中其他软件系统的通信功能。
数据库系统一般由数据库、数据库管理系统(及其工具)、应用程序和数据库管理员构成。
数据模型通常由三个部分组成:数据结构、数据操作、完整性约束。
数据结构是描述一个数据模型性质最重要的方面。
数据操作是在对象的实例上允许进行的操作的集合。
数据的完整性约束条件是一组规则,这组规则对数据及其关系起到制约的作用。
概念模型
(1)实体:客观存在并可相互区别的事物,例如:一个职工、一个学生、一个部门等。
(2)属性:实体所具有的的某一特性,一个实体可以由若干个属性来刻画。例如:学生的实体可以由学号、姓名、性别、出生年月、所在院系、入学时间等属性组成。属性组合(201915121,张山,男,2001505,计算机系,2019)即表征了一个学生。
(3)码:唯一标识实体的属性集。例如:学号是学生实体的码。
(4)实体型:用实体名及其属性名集合来抽象和刻画同类实体,例如:学生(学号,姓名,性别,出生年月,所在院系,入学时间)就是一个实体型。
(5)实体集:同一类型实体的集合。例如:全体学生就是一个实体集。
(6)联系:实体之间的联系通常指不同实体集之间的联系。实体之间的联系有一对一、一对多和多对多等多种类型。
物理模型
物理模型(PhysicalDataModel)表示将如何在数据库中构建模型。物理数据库模型显示所有表结构,包括列名称,列数据类型,列约束,主键,外键以及表之间的关系。物理数据模型的功能包括:
规范所有表和列。
外键用于标识表之间的关系。
非规范化可能基于用户需求而发生。
物理上的考虑可能会导致物理数据模型与逻辑数据模型有很大不同。
对于不同的RDBMS,物理数据模型会有所不同。例如,MySQL和SQL Server之间的列的数据类型可能不同。
物理数据模型设计的步骤如下:
将实体转换成表格。
将关系转换为外键。
将属性转换为列。
根据物理约束/要求修改物理数据模型。
层次模型的优缺点
优点
层次模型的数据结构比较简单清晰;
查询效率高,性能优于关系模型,不低于网状模型;
层次数据模型提供了良好的完整性支持。
缺点
结点之间的多对多联系表示不自然;
对插入和删除操作的限制多,应用程序的编写比较复杂;
查询子女结点必须通过双亲结点;
层次命令趋于程序化;
网状模型的优缺点
优点
a.能够更为直接地描述现实世界,如一个结点可以有多个双亲
b.具有良好地性,存取效率较高
缺点
a.结构比较复杂,而且随着应用环境地扩大,数据库就变得越来越复杂,不利于最终用户掌握
b.DDL、DML语言复杂,用户不容易使用
c.记录之间联系是通过存取路径实现地,用户必须了解系统结构地细节
关系(Relation)
●一个关系对应通常说的一张表
元组(Tuple)
●表中的一行即为一个元组
属性(Attribute )
●表中的一列即为一个属性,给每–个属性起一个名称即属性名
主码(Key)
●也称码键。表中的某个属性组,它可以唯一 确定一个元组
域(Domain )
●是一组具有相同数据类型的值的集合。属性的取值范围来自某个域。
分量
●元组中的一一个属性值。
关系模式 ●对关系的描述 关系名(属性1,属性2,,.属性n) 学生(学号,姓名,年龄,性别,系名,年级)
优点
1.建立在严格的数学概念的基础上
2.概念单一
●实体和各类联系都用关系来表示
●对数据的检索结果也是关系
3.关系模型的存取路径对用户透明
●具有更高的数据独立性,更好的安全保密性
●简化了程序员的工作和数据库开发建立的工作
缺点
1.存取路径对用户透明,查询效率往往不如格式化数据模型
2.为提高性能,必须对用户的查询请求进行优化,增加了开发数据库管理系统的难度
模式—全体数据的逻辑结构
外模式—用户模式,子模式
内模式—存储模式
优点:数据库系统的三级模式是对数据的三个抽象级别,它把数据的具体组织留给DBMS管理,使用户能逻辑抽象地处理数据,而不必关心数据在计算机中的表示和存储。
二级映像功能分别是:外模式/模式映像、模式/内模式映像
令A和B是任意两个集合,若序偶的第一个成员是A的元素,第二个成员是B的元素,所有这样的序偶集合,称为集合A和B的笛卡尔乘积或直积,记做A X B
关系是笛卡尔积的子集
R(U,F)
R:关系名
F:数据的依赖关系集合
关系模型中有三类完整性约束,分别是:实体完整性,参照完整性,用户定义完整性
并、差、交、广义笛卡尔积
选择、投影、连接、除
数据定义
create 、alter、drop
数据操作
Insert、delete、update、select
数据操纵
Grant、Revoke
•Count()、avg()、sum()等函数
•Group by、order by
•In、not in ,
•exists、not exists
•Between
•Like
重点复习作业
嵌套查询
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
一.单列索引
1:普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一 点。
2:**唯一索引:**索引列中的值必须是唯一的,但是允许为空值。
3:主键索引:是一种特殊的唯一索引,不允许有空值。(主键约束,就是一个主键索引)。
二、组合索引
三、全文索引
create [unique] [cluster] index <索引名> on <表名>(<列名>)
create view via
as
select AVG(sal) "avg_sal" from emp
关于with check option
首先视图只操作它可以查询出来的数据,对于它查询不出的数据,即使基表有,也不可以通过视图来操作。
对于update,有with check option,要保证update后,数据要被视图查询出来
对于delete,有无with check option都一样
对于insert,有with check option,要保证insert后,数据要被视图查询出来
对于没有where 子句的视图,使用with check option是多余的。
第一点: 使用视图,可以定制用户数据,聚焦特定的数据。
第二点:使用视图,可以简化数据操作。
第三点:使用视图,基表中的数据就有了一定的安全性
第四点:可以合并分离的数据,创建分区视图
添加列
ALTER TABLE student
ADD class VARCHAR(20) NULL
删除列
ALTER TABLE student
DROP COLUMN class
修改表的列数据类型和名称
-- 修改数据类型
ALTER TABLE student
ALTER COLUMN class VARCHAR(20) NOT NULL
-- 修改列名
EXEC sp_rename 'class','st_class'
1、非授权用户对数据库的恶意存取和破坏
2、数据库中重要或敏感的数据被泄露
3、安全环境的脆弱性
用户身份鉴别
每个用户标识由用户名和用户标识号(UID)两部分组成。
存取控制
存取控制机制主要包括定义用户权限和合法权限检查两部分
自主存取控制方法
主要通过 SQL 的 grant 语句和 revoke 语句来实现
授权:授予与收回
SQL 中使用 grant 和 revoke 语句向用户授予或收回对数据的操作权限。
数据库角色
数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。因此可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。在 SQL 中首先用 create role 语句来创建角色,然后用 grant 语句给角色授权,用 revoke 语句收回授予角色的权限。
强制存取控制方法
创建角色的 SQL 语句格式是:
create role <角色名> ;
刚刚创建的角色是空的,没有任何内容,可以用 grant 为角色授权。
grant <角色1>[,<角色2>] ···
on <对象类型> 对象名
to <角色> [,<角色>] ···
//数据库管理员和用户可以利用 grant 语句将权限授予某一个或几个角色
此外,还可以将一个角色授予其他的角色或用户:
grant <角色1> [,<角色2>]···
to <角色3> [,<用户1>]···
[ with admin option ]
该语句把角色授予某用户,或授予另一个角色。这样,一个角色(例如角色3)所拥有的权限就是授予它的全部角色(例如角色1和角色2)所包含的权限的总和。授予者或是角色的创建者,或者拥有在这个角色上的 admin option ,如果指定了 with admin option 子句,则获得某种权限的角色或用户还可以把这种权限再授予其他的角色。一个角色包含的权限包括直接授予这个角色的全部权限加上其他角色授予这个角色的全部权限。
用户可以收回角色的权限,从而修改角色拥有的权限。其格式为:
revoke <权限> [,<权限>]···
on <对象类型><对象名>
from <角色1>[,<角色2>]···
同样,revoke动作的执行者或者是角色的创建者,或者拥有在这个(些)角色上的 admin option 。下面举一些例子:
//创建一个角色 R1
create role R1 ;
//授予角色 R1 对表 Student 的 select、update、insert 权限
grant select,update,insert
on table Student
to R1 ;
//将这个角色授予张三、李四、王五,使他们具有角色 R1 所包含的全部权限
grant R1
to 张三,李四,王五 ;
//可以一次性地通过 R1 来收回张三的三个权限
revoke R1
from 张三
//角色的权限修改 : 增加 Student 表的 delete 权限
grant delete
on table Student
to R1 ;
//减少角色对表 Student 的 select 权限
revoke select
on table Student
from R1 ;
可以看出,数据库角色是一组权限的集合。使用角色来管理数据库权限可以简化授权的过程,使自主授权的执行更加灵活、方便。
一般处理方法为拒绝执行
列级定义:
CREATE TABLE Student
(
Sno NUMERIC(6) CONSTRAINT C1 CHECK(So BETWEEN 90000
/* c1为当前约束条件的名字 ,使用的是 check 约束*/
AND 99999) CONSTRAINT StudentKey PRIMARY KEY(Sno),
/* StudentKey 为当前约束条件的名字 */
/* PRIMARY KEY 主键是 sno 学号*/
Sname CHAR(20) CONSTRAINT C2 NOT NULL,
/* c2 是约束的名字,约束条件是 not null:不能为空*/
Sage NUMERIC(3) CONSTRAINT C3 CHECK(Sage<30),
Ssex CHAR(2) CONSTRAINT C4 CHECK(Ssex IN('男','女'))
);
表级定义(建议使用):
CREATE TABLE Student
(
Sno NUMERIC(6),
Sname CHAR(20),
Sage NUMERIC(3),
Ssex CHAR(2),
CONSTRAINT StudentKey PRIMARY KEY(Sno),
CONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 99999),
CONSTRAINT C2 CHECK(sname IS NOT NULL),
CONSTRAINT C3 CHECK(Sage<30),
CONSTRAINT C4 CHECK(Ssex IN('男','女'))
);
使用ALTER TABLE语句修改表中的完整性限制。
例:去掉student表中对性别的限制。
ALTER TABLE Student
DROP CONSTRAINT C4;
例: 修改表Student中的约束条件,要求年龄由小于30改为小于40。
修改的方案是先删除原来的约束条件,再增加新的约束条件
/* 先删除原来的约束 */
ALTER TABLE Student
DROP CONSTRAINT C3;
/* 再增加新的约束 */
ALTER TABLE Student
ADD CONSTRAINT C3 CHECK(Sage < 40);
SQL Server包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。
Insert 触发器:
在向目标表中插入数据后,会触发该表的Insert 触发器,系统自动在内存中创建inserted表; 下面的demo中对Age加了判断,如果不满足判断数据会进行回滚,插入的数据操作会失败。
--Insert 触发器
Create TRIGGER [dbo].[Trigger_Insert]
ON [dbo].[Person]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
Declare @age int;
Select @age=Age From inserted
--如果年龄小于150正常插入,否则数据回滚
IF(@age<150)
Begin
Insert into PersonLog(PersonID, Name, Age, AddDate)
Select ID, Name, Age, AddDate From inserted
End
ELSE
Begin
print('年龄应小于150')
rollback transaction --数据回滚
END
Update 触发器:
在向目标表中更新数据后,会触发该表的Update 触发器,系统自动在内存中创建deleted表和inserted表,deleted表存放的是更新前的数据,inserted表存放的是更新的数据。
--Update 触发器
Create TRIGGER [dbo].[Trigger_Update]
ON [dbo].[Person]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
--这里是先删除后插入,存在一张临时表deleted
Insert Into PersonLog(PersonID, Name, Age, AddDate, UpdateDate)
Select ID, Name, Age, AddDate, UpdateDate From inserted
Delete 触发器:
在向目标表中删除数据后,会触发该表的Delete 触发器,系统自动在内存中创建deleted表,deleted表存放的是删除的数据。
--Delete 触发器
Create TRIGGER [dbo].[Trigger_Delete]
ON [dbo].[Person]
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
Insert Into PersonLog(PersonID, Name, Age, AddDate, UpdateDate, DeleteDate)
Select ID, Name, Age, AddDate, UpdateDate, GETDATE() From deleted
触发器优点:
1.强化约束:强制复杂业务的规则和要求,能实现比check语句更为复杂的约束。
2.跟踪变化:触发器可以侦测数据库内的操作,从而禁止数据库中未经许可的更新和变化。
3.级联运行:侦测数据库内的操作时,可自动地级联影响整个数据库的各项内容。
4.嵌套调用:触发器可以调用一个或多个存储过程。触发器最多可以嵌套32层。
触发器缺点:
1.可移植性差。
2.占用服务器资源,给服务器造成压力。
3.执行速度主要取决于数据库服务器的性能与触发器代码的复杂程度。
4.嵌套调用一旦出现问题,排错困难,而且数据容易造成不一致,后期维护不方便。
包括删除、更新、插入异常
概念:在一个表里面,属性X可以映射到属性Y,也就是说知道了X就能确定Y,称X为决定因素。
如果我想知道某位学生的姓名Sname,那我知道他的学号Sno就可以了。也就是说Y[Sname]只函数依赖于X[Sno,Cno]中的子集x[Sno],此时称Y部分函数依赖于X。
如果我想知道某位学生的某一门课的成绩Grade,那我必须得同时知道他的学号Sno和课程号Cno。
但如果我只知道一部分信息,比如他的Sno或者Cno可以吗?答案是不行的!此时称Y[Grade]完全依赖于X[Sno,Cno]。
有一个关系模式S(Sno,Sdept,Mname)
如果我知道了一个学生的学号Sno,那我就能知道他所在的系Sdept。(因为理论上一个学生只属于一个系)
如果我知道了某一个系Sdept,那么我就能知道这个系的系主任的姓名Mname。(一个系只有一个正的系主任,别杠,你赢了。)
也就是说,我知道了一个学生的学号Sno,其实我就知道了他所在系的系主任的姓名Mname。但这个过程中,他们是不存在直接函数依赖的,我需要通过系名称Sdept作为一个桥梁去把二者联系起来的。
1NF:关系属性不可再分
2NF:消除非主属性对码的部分函数依赖
3NF:消除非主属性对码的传递函数依赖
BCNF(修正的3NF):消除主属性对码的非完全依赖
第一范式:属于第一范式的关系,其每一行和每一列相交的位置有且仅有一个值
第二范式:满足第一范式的要求并且每个非主关键字属性都完全函数依赖于主关键字的关系
第三范式:定义:满足第一范式和第二范式的要求并且要求所有非主关键字属性都不传递依赖于主关键字的关系
BCNF:定义:当且仅当每个函数依赖的决定方都是候选关键字时,某一关系才是BCNF的
满足BCNF的关系一定满足3NF,但是满足3NF的关系不一定满足BCNF
1.系统需求分析阶段:(重要性)
进行数据库设计首先必须准确了解与分析用户需求(包括数据与处理)。需求分析是整个设计过程的基础,是最困难、最耗费时间的一步。
2.概念结构设计阶段;
概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合、归钠与抽象,形成一个独立于具体DBMS的概念模型。
3.逻辑结构设计阶段:
逻辑结构设计是将概念结构转换为某个DBMS所支持的数据模型,并对其进行优化
4.数据库物理设计阶段;
物理设计阶段:物理设计是为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。
5.数据库实施阶段;
在数据库实施阶段,设计人员运用DBMS提供的数据库语言(如SQL)及其宿主语言,根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行
6.数据库运行和维护阶段;
数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。
1:含嵌入式SQL语句的主语言程序。
2:关系数据库管理系统预处理程序转换嵌入式SQL语句为函数调用。
3:转换后的主语言程序。
4:主语言编译程序编译处理。
5:目标语言程序。
1 定义/声明游标:就是定义一个游标名,以及与其相对应的SELECT 语句。
格式:
CURSOR cursor_name
IS
select_statement;
2 打开游标:就是执行游标所对应的SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。
3 提取游标数据:就是检索结果集合中的数据行,放入指定的输出变量中。
4关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH 语句取其中数据。关闭后的游标可以使用OPEN 语句重新打开。
格式:
CLOSE cursor_name;
go
create proc proc_get_student
as
select * from student;
--调用、执行存储过程
exec proc_get_student;
--修改存储过程
alter proc proc_get_student
as
select * from student
--带参存储过程
if (object_id('proc_find_stu', 'P') is not null)
drop proc proc_find_stu
go
create proc proc_find_stu(@startId int, @endId int)
as
select * from student where id between @startId and @endId
go
exec proc_find_stu 2, 4;
事务的基本概念:一组要么同时执行成功,要么同时执行失败的SQL语句,是数据库操作的一个执行单元
事务的四大特点(ACID):
atomicity(原子性):表示一个事务内的所有的操作是一个整体,要么全部成功,要么全部失败
consistency(一致性):表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态
isolation(隔离性):事务查看时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据
durability(持久性):持久性事务完成之后,它对于系统的影响是永久性的
串行方式
并行方式
SQLserver的四种隔离级别
不可重复读:不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。
幻读:当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,
会发现有新的“幻影” 行;
第一级别:Read Uncommitted 最低隔离级别 会引起脏读问题
第二级别:read commit 解决了脏读(读取到了未提交的数据)的问题 但不能解决不可重复读问题
第三级别:Repeatable Read 解决了不可重复读的问题 不能解决幻读的问题
第四级别:Serializable(可序列化) 解决了幻读的问题,为最高隔离级别。
封锁类型:
共享锁(S锁) 读锁 :事务T对数据对象A加上S锁,则只允许T读A但不能修改A,其他事务只能再对A加S锁而不能加X锁,直到T释放A上的S锁为止。其它事务只能再对A加S锁,而不能加X锁
排他锁(X锁) 写锁 :事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能在对A加任何类型的锁,直到T释放A上的锁为止。其它任何事务都不能再对A加任何类型的锁
一级封锁协议
一级封锁协议是指,事务T在修改数据R之前必须先对其加X锁,直到事务结束后才释放。
可以解决丢失修改的问题。
二级封锁协议
在一级封锁协议基础上增加事务T在读取数据R之前必须先对其加S锁,读完后即可释放。
可以防止读脏数据。
三级封锁协议
在一级封锁协议基础上增加事务T在读取数据R之前必须先对其加S锁,直到事务结束后释放。
解决不可重复读问题。
两段锁的含义
第一段是获得封锁,也称扩展阶段
第二段是释放封锁,也称收缩阶段
事务可以释放任何数据项上任何类型的锁,但是不能获得锁
遵守两段锁协议就可以进行串行化调度
事务内部的故障可分为预期的和非预期的,其中大部分故障都是非预期的。预期的事务内部故障是指可以通过事务程序本身发现的事务内部故障;非预期的事务内部故障是不能由事务程序处理的,如运算溢出故障,并发事务死锁故障、违反了某些完整性限制而导致的故障等。
系统故障(也称为软故障):
是指数据库在运行过程中,由于硬件故障、数据库软件及操作系统的漏洞、突然停电灯情况,导致系统停止运转,所有正在运行的事务以非正常方式终止,需要系统重新启动的一类故障。这类事务不破坏数据库,但是影响正在运行的所有事务。
介质故障:
介质故障也称为硬故障,主要指数据库在运行过程中,由于磁头碰撞、磁盘损坏、强磁干扰、天灾人祸等情况,使得数据库中的数据部分或全部丢失的一类故障。
计算机病毒故障:
计算机病毒故障是一种恶意的计算机程序,它可以像病毒一样繁殖和传播,在对计算机系统造成破坏的同时也可能对数据库系统造成破坏(破坏方式以数据库文件为主)。
预期的事物内部故障:将事物回滚,撤销数据库的修改
非预期的事物内部故障:强制回滚事务,在保证该事务对其他事务没有影响的条件下,利用日志文件撤销其对数据库的修改。
系统故障:待计算机重新启动之后,对于未完成的事务可能写入数据库的内容,回滚所有未完成的事务写的结果;对于已完成的事务可能部分或全部留在缓冲区的结果,需要重做所有已提交的事务(即撤销所有未提交的事务,重做所有已提交的事务)。
介质故障的软件容错:使用数据库备份及事务日志文件,通过恢复技术,恢复数据库到备份结束时的状态。
介质故障的硬件容错:采用双物理存储设备,使两个硬盘存储内容相同,当其中一个硬盘出现故障时,及时使用另一个备份硬盘
计算机病毒故障:使用防火墙软件防止病毒侵入,对于已感染病毒的数据库文件,使用杀毒软件进行查杀,如果杀毒软件杀毒失败,此时只能用数据库备份文件,以软件容错的方式恢复数据库文件。
事务故障的恢复
事务故障是指事务在运行至正常终点前被终止,这时恢复子系统应利用日志文件撤销UNDO此事务已对数据库进行的修改。事务故障的恢复是由系统自动完成的,对用户是透明的,系统的恢复步骤是:
1:反向扫描日志文件,即从最后向前扫描日志文件,查找该事务的更新操作。
2:对该事务的更新操作执行逆操作,即将日志记录中更新前的值写入数据库。
3:继续反向扫描日志文件,查找事务的其他操作,并做同样处理。
4:如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。
系统故障的恢复
系统故障造成数据库不一致状态的原因有二个,一是未完成事务对数据库的更新操作可能已经写入数据库,二是已经提交的事务操作对数据库的更新可能还留在缓冲区没有来的及写入数据库。因此恢复操作就是在撤销故障发生时未完成的事务,重写已经完成的事务。
系统的恢复步骤是:
1:正向扫描日志文件,即从头开始扫描文件,找出在故障发生前已经提交的事务,将这些事务标记入重做队列,同时找出故障发生时尚未完成的事务,将其事务标记入撤销队列。
2:对撤销队列中的各个事务进行撤销处理。进行撤销处理的方法,反向扫描日志文件,对每个撤销事务的更新操作执行逆操作。
3: 对重做队列中的各个事务进行重做处理。进行重做处理的方法是正向扫描日志文件,对每个重做事务重新执行日志文件登记的操作。
介质故障的恢复
发生介质故障后,磁盘上的物理数据和日志文件被破坏,这是最严重的一种故障,恢复方法是重装数据库,然后重做已经完成的事务。
1:装入最新的数据库后备副本,使数据库恢复到最近的一次转储是的一致性状态。
2:装入相应的日志文件副本,重做已经完成的事务,即扫描日志文件,找出故障发生时已经提交的事务标识,将其记入重做队列,然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。
数据转储:DBA定期将数据库复制到磁盘上保存起来,能够使因某种原因而遭到破坏的数据库进行恢复为上一次备份的状态。
转储方法:
①静态转储:转储期间不能对数据库进行任何存取等活动,是最直接的转储方法,必须等待转储完毕后才能对数据库进行存取修改等操作;静态转储效率会比较低,转储期间,新的事务无法进行;
②动态转储:转储期间允许对数据进行存取或者修改;动态转储相比静态转储的好处是转储期间,不会影响新事务的运行,效率有所提高;但转储结束后的数据并不能保证即时生效,如果转储期间,事务对数据进行了修改的话,转储后的数据就不能与原数据库中的数据保持一致性,因此要把转储期间事务对数据库进行的修改活动等记录下来成为日志文件,再合并上转储后的数据,才能与原数据库保持数据一致性;
③海量转储:每次都转储整个数据库;相比于动态转储的好处是,不用担心数据一致性的问题,在转储后不必进行记录日志文件等操作,对于恢复数据库会相对简单;但若数据库很大,那么每次转储耗费时间就会很长,也浪费存储空间;
④增量转储:每次只转储上次备份后变化的数据;相对于海量转储,提高了转储效率,只对更新的数据进行转储,实际上也是减少了数据冗余,是比较实用高效的转储方法;
第一种办法:直接从XXX.mdf文件中恢复:
1.不需要自己新建一个数据库,直接启动管理界面
2.右键点击数据库->附加
3.点击添加,找到.mdf文件的位置;
4.这时候可能会出现这种没有执行权限的错误,错误代码,5021,解决方法,更改权限
这个时候就可以了,还有就是这里的数据库名字必须通过脚本来改变,不然默认的是一长窜的路径名
第二种方法:从备份文件中恢复
1.先新建好数据库
2.在新建的数据库右键点击,任务->还原->数据库:
3.然后找到数据备份文件 .bak文件就可以了!